mysqli扩展库---事务控制

1, 有一张银行账号表

create table account(
    id int primary key,
    balance float
);

2,现在有一段php程序,要完成把1号10元钱,转到2号账号上

<?php
$mysqli = new MySQLi("127.0.0.1","root","123456","test");
if($mysqli->connect_error){
    die("连接错误".$mysqli->connect_error);
}
$sql1 = "update account set balance = balance -2 where id = 1";
$sql2 ="update account set balance2 = balance + 2 where id = 2";
$b1 = $mysqli->query($sql1) or die($mysqli->error);
$b2 = $mysqli->query($sql2) or die($mysqli->error);
if(!$b1 || !$b2){
    echo "失败!";
}else{
    echo "成功!";
}
$mysqli->close();

  从上面代码可知,如果$sql1此时需要一种方法来控制两个sql操作同时成功,同时失败。

3,事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。

<?php
$mysqli = new MySQLi("127.0.0.1","root","123456","test");
if($mysqli->connect_error){
    die("连接错误".$mysqli->connect_error);
}
//将提交设为false,【事务一旦提交就没有机会回滚】
$mysqli->autocommit(false);
//设定保存点1
$sql1 = "update account set balance = balance -2 where id = 1";
$sql2 ="update account set balance2 = balance + 2 where id = 2";
$b1 = $mysqli->query($sql1); //每次执行query时候,会设定保存点,此处设定保存点2
$b2 = $mysqli->query($sql2); //此处设定保存点3

if(!$b1 || !$b2){
    echo "失败!".$mysqli->error;
    $mysqli->rollback(); //如果失败,回滚到保存点1
}else{
    echo "失败!";
    $mysqli->commit();  //一旦提交,没有机会回滚
}
$mysqli->close();

4,在mysql控制台可以使用事务来操作,具体步骤如下:

① 开启一个事务,start transaction。

② 做保存点,如果不做,在开启事务时候,默认做一个保存点。savepoint 保存点名称。

③ sql操作。

④ 可以回滚,可以提交。如果没有问题就提交commit;如果觉得有问题就回滚,rollback  to 某个保存点;一旦提交,就没法回滚。

5,事务的四大特点acid

① 原子性(Atomicity),原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

② 一致性(Consistency),事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

③ 隔离性(IsoIation),事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

④ 持久性(Durability),持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

时间: 2024-10-31 03:08:03

mysqli扩展库---事务控制的相关文章

边记边学PHP-(十七)PHP使用MySQLi扩展库操作数据库2

从前天开始,我的电脑不知道怎么了,写程序的时候无缘无故就死机.还不是彻底死,鼠标还能动,就是点击不好使,也打不开任务管理器.昨晚检查一下硬盘,有六个坏道,也不知道是不是这个原因.但是我在玩的时候,只要不打开编译器写程序,啥事也没有.玩游戏也不回出现那种情况.把我搞得好烦. 四.Mysqli扩展库增强 MySQLi扩展库在基础操作上看着没什么不同,只是从面面向过程转换成了面向对象.但是既然是mysql扩展库的增强,那一定有强的地方.有如下代码: 1.批量执行sql语句 <?php //mysqli

mysqli扩展库操作mysql数据库

配置环境 配置php.ini文件让php支持mysqli扩展库 extension=php_mysqli.dll 建库建表 详见博客 “mysql扩展库操作mysql数据库” 查询数据库 1 <?php 2 //mysqli扩展库操作mysql数据库,面向对象 3 $mysqli=new MySQLi("localhost","root","root","test"); 4 if($mysqli->connect_

【小结】有关mysql扩展库和mysqli扩展库的crud操作封装

现阶段php如果要操作mysql数据库 php给我们提供了3套库 1.mysql扩展库   面向过程操作 2.mysqli扩展库  面向对象操作和面向过程操作并存  安全性和效率高于mysql扩展库 3.PDO扩展库    面向对象操作 今天这篇博文主要要谈谈mysql扩展库和mysqli扩展库 主要是记录了着2套crud操作分装 以下代码段是关于mysqli扩展库关于crud操作的封装 header("Content-type:text/html;charset=utf-8"); c

PHP使用mysqli扩展库实现增删改查(面向对象版)

mysqli扩展库是mysql扩展库的改进版本,在mysql扩展库的基础上提高了稳定性和效率,mysqli扩展库有两套东西,一套就是面向过程的mysqli另一套是面向对象的mysqli.操作方式大体和mysql扩展库大体一致,这次还是先抽取出来一个操作mysql的工具类,和调用的类. 1.mysqli扩展库操作数据库工具类 <?php //数据库操作类 class DBUtil{ private $host="localhost"; private $username="

php数据库编程---mysqli扩展库

1,mysqli扩展库允许我们访问MySQL数据库,并对MySql数据库进行curd操作.Mysqli扩展库比mysql扩展库加强了. 2,mysqli扩展库和mysql扩展库的比较 ① mysqli的稳定性和安全性,效率有所提高: ② mysqli支持面向对象编程,同时mysqli扩展库考虑到php老程序员,提供面向过程的编程风格. 3,mysqli有两套编程风格 4,mysqli编程的快速入门,编写一个程序,这个程序从user1数据表中读取数据,并打印在网页中. ① 面向对象实现 <?php

边记边学PHP-(十七)PHP使用MySQLi扩展库操作数据库1

上一篇写了使用MySQL扩展库操作数据库,但是MySQL扩展库是完全面向过程的库,与现在逐渐走上舞台的面向对象思想有点差别.那么MySQLi扩展库就很好的解决了这个问题. 一.MySQLi扩展库是什么 mysqli(mysql improve)是mysql扩展库的增强版. mysql扩展库 和mysqli扩展库的比较: 1.mysqli的稳定性.安全性和效率有所提高 2.mysqli支持面向对象编程,以前的mysql是面向过程的.同时mysqli扩展库考虑到PHP老程序员,也提供了面向过程的风格

MySqli扩展库的对象对象属性特点以及与mysql库面向过程的比较

在学习完mysql库来操作mysql的方式,这是一种面向过程的方式,但是,面向对象是大势所趋,mysqli扩展库也就有必须学习的必要了,mysqli作为一个类库,在我们使用的时候都是以面向对象的方式进行操作,所以,这种方案是比较好的,为此,我特意做了它与mysqli扩展库的对应比较: 下面是mysql库的连接,查询语句,返回结果,释放资源的过程: <pre name="code" class="php"><pre name="code&q

PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面向对象:查询列表 1 <?php 2 3 //mysqli 操作数据(面向对象风格) 4 5 #1.创建Mysql对象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test&

mysqli扩展库的 预处理技术 mysqli stmt

问题的提出? 现在需要向mysql数据库添加100个用户,请问如何实现? 思路: 使用for循环100次,向数据库中添加100个用户. 使用批量添加 $sql1=”insert xxx”; $ssql.=”insert xxx ”: ... 使用$msyqli->mutil_query($sql1); 3.方案使用预编译技术,该方案还可以防止sql注入攻击. <?php //预编译演示 //需求: 请使用预处理的方式,向数据库添加三个用户 //1.创建mysqli对象 $mysqli=new