PHP PDO事务自动rollBack

jir*_*iya 5 php pdo transactions

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

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

chr*_*guy 13

你必须自己调用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();
Run Code Online (Sandbox Code Playgroud)

但是,当脚本结束时,PDO将回滚任何打开的事务.

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

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


vvz*_*vzh 13

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

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

但是,如果出现错误,显式回滚事务是一种很好的做法.有关更多详细信息,请参阅此问题:如果PHP PDO事务失败,我是否必须明确地回滚()?