这是我的脚本:
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/