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元了。
PHP使用PDO进行事务处理
原文地址:https://www.cnblogs.com/patermenkey/p/8270733.html