2013-05-18 26 views
3

我只是在我最近使用PHP ADODB库转换为PDO的应用程序之一改进了一些代码。在adodb启动事务后,如果在begin和commit命令之间发生查询时出现异常,它将自动回滚。PHP PDO事务自动rollBack

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

回答

5

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

那么该交易将可能得到取决于你的应用程序回滚(也许你有一个甚至听众的地方,那将犯下的吗?)。在发生异常的地方进行显式回滚可能是一个好主意。

+0

但是...如果你开始事务,做一些插入和更新,然后使ALTER TABLE失败行大于1,默认行为是在实践中提交... MySQL 5.7 。 – 18C

+0

正确,MySQL DDL查询(如ALTER TABLE,CREATE TABLE等)创建一个隐式提交。 https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html – chrisguitarguy

10

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

当脚本结束时,或者当一个连接即将被关闭,如果你有一个未完成的事务,PDO将自动回滚。 ...如果您没有明确提交事务,则认为事情出错了,所以回滚是为了您的数据的安全性而执行的。

尽管如此,在发生错误时显式回滚事务是一种很好的做法。看到这个问题的更多细节:If an PHP PDO transaction fails, must I rollback() explicitely?

+0

感谢您提供的信息,实际上非常有趣,我正在寻找什么。不知道我是如何在文档中错过的。再次感谢。 – jiraiya