PDO如何在执行rollBack()函数之前回滚查询?

时间:2016-07-26 00:52:10

标签: php mysql pdo

这是我的剧本:

try {
    $dbh_con->beginTransaction();

        $stmt1 = $dbh_conn->prepare("UPDATE activate_account_num SET num = num + 1");
        $stmt1->execute();

        $stmt2 = $dbh_con->prepare("SELECT user_id FROM activate_account WHERE token = ?");
        $stmt2->execute(array($token));
        $num_rows = $stmt2->fetch(PDO::FETCH_ASSOC);

        if ( $num_rows['user_id'] ){
            $_SESSION['error'] = 'all fine';

        } else {
            $_SESSION['error'] = 'token is invalid';
            header('Location: /b.php');
             exit();
        }

    $dbh_con->commit();

    header('Location: /b.php');
    exit();

} catch(PDOException $e) {

    $dbh_con->rollBack();

    $_SESSION['error'] = 'something is wrong';
    header('Location: /b.php');
    exit();
}

如您所见,else块包含exit()功能。因此,当else块执行时,肯定rollBack();函数不会执行,因为在执行rollBack();之前,脚本退出。但令人惊讶的是UPDATE语句回滚..如何?

2 个答案:

答案 0 :(得分:3)

当所有变更一起发生或根本没有发生变化时,使用交易。

为了在突然停止的情况下保持数据库的完整性(例如:脚本意外退出,服务器崩溃,电源被切断......),事务的实现将保持您的保护,直到{才进行任何更改{1}}被调用。当您commit()进行中间查询时,更改实际上并未访问数据库,而是处于不确定状态。如果你在没有提交的情况下退出,那么就会被抛弃。

当你execute时,也会被抛弃。

答案 1 :(得分:1)

在正常情况下,当脚本退出时,php客户端断开连接,这将导致MySQL中的回滚。