我只是在我最近从使用 PHP ADODB 库转换为 PDO 的一个应用程序上改进了一些代码。在 adodb 中,一旦您启动事务,如果在开始和提交命令之间的查询出现任何异常,它会自动回滚。
PDO 是否也这样做。如果一个有查询的方法在 PDO 中的开始和提交之间失败,那么 trsaction 会自动回滚还是需要隐式调用?
我只是在我最近从使用 PHP ADODB 库转换为 PDO 的一个应用程序上改进了一些代码。在 adodb 中,一旦您启动事务,如果在开始和提交命令之间的查询出现任何异常,它会自动回滚。
PDO 是否也这样做。如果一个有查询的方法在 PDO 中的开始和提交之间失败,那么 trsaction 会自动回滚还是需要隐式调用?
您必须自己调用回滚(并提交),PDO
不会为您这样做。像这样的东西:
$pdo = new \PDO(/* ... */);
$pdo->beginTransaction();
try {
// do stuff..
} catch(\Throwable $e) { // use \Exception in PHP < 7.0
$pdo->rollBack();
throw $e;
}
$pdo->commit();
但是,当脚本结束时, PDO 将回滚任何打开的事务。
当脚本结束或连接即将关闭时,如果您有未完成的事务,PDO 会自动回滚。
因此,根据您的应用程序,事务可能会回滚(也许您有一个甚至会为您提交的某个地方的侦听器?)。在异常发生的地方附近进行显式回滚可能是个好主意。
来自http://www.php.net/manual/en/pdo.transactions.php:
当脚本结束或连接即将关闭时,如果您有未完成的事务,PDO 会自动回滚。...如果您没有明确提交事务,则假定出现问题,因此为了您的数据安全而执行回滚。
尽管如此,在发生错误时显式回滚事务是一种很好的做法。有关详细信息,请参阅此问题:如果 PHP PDO 事务失败,我必须显式地回滚()吗?