事务是确保数据库一致的机制,作为一个单元的一组有序的数据库操作。在事务的组中哪怕有一个环节操作失败,事务也不成功,则整个事务将被回滚,该事务中的所有操作都将被撤销。只有组中的所有SQL语句都操作成功,则认为事务成功,事务才被提交。

下面,介绍几个PDO中要用到的关于事务处理的函数:

###beginTransaction()函数:

该方法来启动一个事务,标明了回滚起始点。如果底层驱动成程序不支持事务,那么PHP将会抛出一个PDOException的异常。

###commit()函数:

该函数用来提交一个事务,并且执行SQl。

###rollback()函数:

该函数用来回滚一个事务。

下面来构建一个事务处理的程序:

在淘宝购物时,当我们选好一个价格为100元的宝贝,我们采用网银进行转账。假设用户A向B转账100元。首先在demo数据库准备好一个InnoDB引擎的数据表account。废话不多说,直接上代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
//PDO事务处理练习
$dsn = 'mysql:host=localhost;dbname=demo';
$user = 'root';
$pwd = 'password';
$pdo = new PDO($dsn, $user, $pwd);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);      //设置异常处理模式
$pdo->setAttribute(PDO::ATTR_AUTOCOMMIT, 0);                        //关闭自动提交

//异常处理转账事务
try {
    $price = 100;
    $pdo->beginTransaction();          //开启一个事务

    $affected_rows = $pdo-exec("update account set cash=cash-{$price} where name='A'");     //转账

    if ($affected_rows > 0) {
        echo 'A转出{$price}成功';
    } else {
        throw new PDOException ('A转账失败');       //抛出异常
    }

    $affected_rows = $pdo-exec("update account set cash=cash+{$price} where name='B'");     //转入

    if ($affected_rows > 0) {
        echo 'B转入{$price}成功';
    } else {
        throw new PDOException ('B转入失败');       //抛出异常
    }

    echo '交易成功';
    $pdo->commit();       //事务执行成功
} catch (PDOException $e) {
    echo '交易失败' .$e->getMessage();
    $pdo->rollback();     //事务回滚
}
?>

这个事务处理的过程需要两条sql更新语句来一起合作完成,所以采用事务处理来确保两条sql语句对数据操作的一致性。一旦发生错误,则catch快就可以捕获异常并进行回滚事务发生的所有更改,并打印一条错误信息。