PHP使用PDO进行事务处理
1.PDO执行SQL语句
exec()执行一条SQL语句,返回影响行数。
query()执行一条SQL语句,发挥结果集,结果集是一个PDOStatement对象。
2.什么是事务
事务就是将多条SQL语句看成一个整体,只要其中有一条语句执行异常,那么所有语句都不能执行,数据库要返回执行第一条语句之前的状态。
假设一个实例,A要向B转账100元。那么这个事务分为两条SQL语句,A的账户减去100元,B的账户增加100元。这两条语句只要有一条不能执行,那么这个事务就不能被执行。
为了详细演示这个事务,首先要创建一张表。
<?php $dsn="mysql:host=127.0.0.1;dbname=example"; $user="root"; $password=''; try { $pdo=new PDO($dsn,$user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql="CREATE TABLE account( id INT(3) PRIMARY KEY AUTO_INCREMENT, user VARCHAR(10) NOT NULL, money INT(10) UNSIGNED NOT NULL);"; $pdo->exec($sql); } catch(PDOException $e) { echo $e->getMessage(); } ?>
插入两条数据
<?php $dsn="mysql:host=127.0.0.1;dbname=example"; $user="root"; $password=''; try { $pdo=new PDO($dsn,$user,$password); $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); $sql="INSERT INTO account VALUES (NULL,'A',200), (null,'B',300);"; $pdo->exec($sql); } catch(PDOException $e) { echo $e->getMessage(); } ?>
下面开始演示事务,
在数据库中默认的模式是自动提交,即使出现问题也是没有办法回滚的。所以首先要使用
$pdo->setAttribute(PDO::AUTOCOMMIT,0);
关闭自动提交,这样一来当出现问题时,就可以使用
$pdo->rollback();
进行回滚,修复操作。
除此之外还要告诉数据库开始事务,表示接下来的SQL语句是一个事务整体使用
$pdo->beginTransaction();
之前已经把自动提交关闭了,所以事务完毕之后,应该用
$pdo->commit();
下面我们要开始执行事务了
1 <?php 2 $dsn="mysql:host=127.0.0.1;dbname=example"; 3 $user="root"; 4 $password=''; 5 try 6 { 7 $pdo=new PDO($dsn,$user,$password); 8 $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 9 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,0); 10 11 $pdo->beginTransaction();//开启事务 12 13 $affected_row=$pdo->exec('UPDATE account SET money=money-100 WHERE user="A" '); 14 15 $affected_row=$pdo->exec('UPDATE account SET money=money+100 WHERE user="B" '); 16 17 /*如果执行出问题会去异常处理部分进行回滚,撤销事务中所有操作*/ 18 19 $pdo->commit();//提交 20 echo "交易成功"; 21 } 22 catch(PDOException $e) 23 { 24 echo $e->getMessage(); 25 $pdo->rollback();//回滚,撤销操作 26 echo "交易失败"; 27 } 28 $pdo->setAttribute(PDO::ATTR_AUTOCOMMIT,1);//别忘了事务完成后开启自动提交 29 ?>
这段脚本如果执行第三次会出错,提示交易失败,因为执行第三次是A的账户里已经没有100元了。