这是我的剧本:
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
语句回滚..如何?
答案 0 :(得分:3)
当所有变更一起发生或根本没有发生变化时,使用交易。
为了在突然停止的情况下保持数据库的完整性(例如:脚本意外退出,服务器崩溃,电源被切断......),事务的实现将保持您的保护,直到{才进行任何更改{1}}被调用。当您commit()
进行中间查询时,更改实际上并未访问数据库,而是处于不确定状态。如果你在没有提交的情况下退出,那么就会被抛弃。
当你execute
时,也会被抛弃。
答案 1 :(得分:1)
在正常情况下,当脚本退出时,php客户端断开连接,这将导致MySQL中的回滚。