rollBack()

1. 定义

该方法回滚一个事务(即撤销事务所做的一切改变,隐式自动提交的 DLL 类语句无法回滚)。

注:

  • DLL 语句:数据定义类语句,包括数据库、表、字段、索引等数据库对象的定义,操作包括创建(create)、修改(alter)和删除(drop)
  • DML 语句:数据操作类语句,限于数据库记录的增(insert)、删(delete)、查(select)、改(update)
  • DCL 语句:数据控制类语句,定义数据库对象的访问权限和安全级别,例如授权(grant)和取消权限(revoke)等
  • MySQL 只有 InnoDB 引擎支持事务,MYISAM 引擎并不支持事务
  • 事务提交并不会自动判断提交的所有 SQL 语句的正确性,也不会自动回滚
  • 一旦开始事务,则只能使用PDO::commit()方法或PDO::rollBack()方法来完成事务

关于数据库的具体内容可转至我们的MySQL教程

2. 语法

PDO::rollBack ( void ) : bool

3. 参数说明

该方法不传入任何参数。

4. 示例

<?php

// PDO::rollBack()
// 回滚一个事务(即撤销事务所做的一切改变,隐式自动提交的 DLL 类语句无法回滚)

try {
    $config = ['driver' => 'mysql', 'host' => 'localhost', 'dbname' => 'test', 'charset' => 'utf8', 'user' => 'root', 'pwd' => 'mysql'];
    $dsn = sprintf('%s:host=%s;dbname=%s;charset=%s', $config['driver'], $config['host'], $config['dbname'], $config['charset']);
    $conn = new PDO($dsn, $config['user'], $config['pwd']);

} catch (PDOException $e) {
    error_log($e->getMessage()); // 将错误信息记录至日志
    echo $e->getMessage();
}

try {
    $conn->beginTransaction();// 启动一个事务

    // 隐式自动提交的 DLL 语句
    $stmt = $conn->prepare('DROP TABLE `movie`');
    $stmt->execute();

    // 开始事务只能和提交事务或者回滚事务成对存在,已提交事务再回滚将导致:There is no active transaction
    // $res = $conn->commit();

    // 尝试回滚:
    // DLL 无法回滚,查看数据库可发现 movie 表已被删除
    $conn->rollBack();
} catch (Exception $e) {
    echo "发生了错误:",$e->getMessage();
}

5. 延展阅读

  • PDO::beginTransaction():声明数据库启动一个事务(Transactions)
  • PDO::commit():提交一个事务。同时数据库驱动返回到“自动提交”状态,直至开启下一次事务