PHP 中 PDO 的 MYSQL 事务处理实例

warning: 这篇文章距离上次修改已过793天,其中的内容可能已经有所变动。

事务处理

事务 (transaction) 是由查询和/或更新语句的序列组成。用 begin、start transaction 开始事务,rollback 回滚事务,commit 提交事务。

在开始事务后,可以有若干个 SQL 查询或更新语句,每个 SQL 递交执行后,还应该有判断是否正确执行的语句,以确定下一步是否回滚,若都被正确执行则最后提交事务。

事务一旦回滚,数据库则保持开始事务前状态。就好象一个被编辑的文件不存盘退出,自然还是保持文件原来的样子。

所以,事务可被视为原子操作,事务中的 SQL,要么全部执行,要不一句都不执行。

如果需要一个事务,则必须用 PDO::beginTransaction() 方法来启动,一旦开始了事务,可用 PDO::commit() 或 PDO::rollBack()来完成,这取决于事务中的代码是否运行成功。

Tips: MySQL只有 InnoDB 驱动支持事务处理,默认 MyIsAM 驱动不支持。

代码示例

连接数据库:

<?php
try {
    // 数据库 PDO 连接
    $pdo = new \PDO('mysql:host=localhost;dbname=mydb', 'root', 'root', array(PDO::ATTR_PERSISTENT => true));
    // 开启异常处理
    $pdo->setAttribute(PDO::ATTR_ERRMODE,  PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
    echo "数据库连接失败:".$e->getMessage();
    exit;
}

事务处理:
在下面例子中,假设为新员工创建一组条目,分配一个为 23 的 ID。除了登记资料,还需要记录工资。

<?php
try {
    // 开启事务处理
    $pdo->beginTransaction();
    // 执行 SQL
    $sql1 = $pdo->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')");
    if (!$sql1) {
        // 抛出异常
        throw new \PDOException("登记资料失败");
    }
    $sql2 = $pdo->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())");
    if (!$sql2) {
        // 抛出异常
        throw new \PDOException("记录工资失败");
    }
    // 没有错误则提交事务
    $pdo->commit();
} catch (\PDOException $e) {
    // 遇到错误则回滚事务
    $pdo->rollBack();
    echo "Failed: " . $e->getMessage();
}

添加新评论