我刚刚在我的一个应用程序上改进了一些代码,我最近使用PHP ADODB库转换为PDO。在adodb中,一旦你启动了一个事务,如果在begin和commit命令之间出现任何异常,它会自动回滚。
PDO是否也这样做。如果一个查询它的方法在PDO的开始和提交之间失败,那么trsaction会自动回滚还是需要隐式调用?
答案 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将自动回滚。
因此,事务将可能根据您的应用程序回滚(也许您有一个甚至是一个会为您提交的地方的监听器?)。在异常发生的地方附近进行显式回滚可能是个好主意。