PHP PDO事务自动rollBack

时间:2013-05-18 19:04:48

标签: php pdo transactions

我刚刚在我的一个应用程序上改进了一些代码,我最近使用PHP ADODB库转换为PDO。在adodb中,一旦你启动了一个事务,如果在begin和commit命令之间出现任何异常,它会自动回滚。

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

2 个答案:

答案 0 :(得分:12)

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

  

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

尽管如此,在出现错误时显式回滚事务是一种很好的做法。有关详细信息,请参阅此问题:If an PHP PDO transaction fails, must I rollback() explicitely?

答案 1 :(得分:11)

您必须自己调用rollback(并提交),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将rollback any open transactions when a script ends

  

当脚本结束或即将关闭连接时,如果您有未完成的事务,PDO将自动回滚。

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