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

标签 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 block 包含 exit() 函数。所以当 else block 执行时,rollBack(); 函数肯定不会执行,因为在执行 rollBack(); 之前,脚本退出。但令人惊讶的是,UPDATE 语句会回滚。怎么办?

最佳答案

当所有更改一起发生或根本不发生更改至关重要时,使用事务。

为了在突然停止的情况下保持数据库的完整性(例如:脚本意外退出、服务器崩溃、电源中断......),事务的实现将通过不做任何更改来保护你,直到 commit() 被调用。当您执行 中间查询时,更改实际上并没有触及数据库,而是处于不确定状态。如果您在没有提交的情况下退出,那么这个 limbo 就被扔掉了。

当你rollBack()时,边缘也被扔掉了。

关于php - PDO 如何在执行 rollBack() 函数之前回滚查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38579529/

相关文章:

php - mysqli_fetch 循环不工作

javascript - 如何将 sno 数据按升序插入数据库?

php - 如何将查询结果添加到新数组中?

mysql - 查询更新 HeidiSql 中表中的外键行

mysql - 通过 WHERE 子句选择所有行

PHP 登录表单 mysql 和 bootstrap 风格给出错误

mysql故意减速

Php mysql 在 IIS 上与 PDO 连接

php - 检查 PDO Fetch select 语句何时返回 null

php - SQL/PHP - 计算结果并根据 HAVING 子句显示它们