7

我只是在我最近从使用 PHP ADODB 库转换为 PDO 的一个应用程序上改进了一些代码。在 adodb 中,一旦您启动事务,如果在开始和提交命令之间的查询出现任何异常,它会自动回滚。

PDO 是否也这样做。如果一个有查询的方法在 PDO 中的开始和提交之间失败,那么 trsaction 会自动回滚还是需要隐式调用?

4

2 回答 2

19

您必须自己调用回滚(并提交),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 会自动回滚。

因此,根据您的应用程序,事务可能会回滚(也许您有一个甚至会为您提交的某个地方的侦听器?)。在异常发生的地方附近进行显式回滚可能是个好主意。

于 2013-05-18T19:10:55.337 回答
14

来自http://www.php.net/manual/en/pdo.transactions.php

当脚本结束或连接即将关闭时,如果您有未完成的事务,PDO 会自动回滚。...如果您没有明确提交事务,则假定出现问题,因此为了您的数据安全而执行回滚。

尽管如此,在发生错误时显式回滚事务是一种很好的做法。有关详细信息,请参阅此问题:如果 PHP PDO 事务失败,我必须显式地回滚()吗?

于 2014-01-17T14:05:03.717 回答