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元了。

posted @ 2018-01-11 23:03  帕特菛琦  阅读(276)  评论(0编辑  收藏  举报