PHP PDO 执行失败时事务会回滚吗?
Posted
技术标签:
【中文标题】PHP PDO 执行失败时事务会回滚吗?【英文标题】:PHP PDO Will transaction rollback when execute fails? 【发布时间】:2017-05-31 13:33:04 【问题描述】:示例代码:
$pdo->beginTransaction();
try
$query1 = $pdo->prepare(...);
$query2 = $pdo->prepare(...);
$query1->execute();
$query2->execute();
$pdo->commit();
catch(Exception $e)
try
$pdo->rollBack();
catch(Exception $re)
//...
//...
我知道prepare可以抛出异常,commit会在没有事务运行时抛出异常。
但是有没有可能出现prepare成功但execute失败的情况呢?会不会造成回滚?当执行失败时提交是否也会抛出(我不这么认为,因为文档说它只在没有事务时抛出)。
那么我应该显式检查执行结果并抛出我自己的异常来导致这样的回滚吗?:
$pdo->beginTransaction();
try
$query1 = $pdo->prepare(...);
$query2 = $pdo->prepare(...);
if(!$query1->execute())
throw new Exception('Query1 failed to execute.');
if(!$query2->execute())
throw new Exception('Query2 failed to execute.');
$pdo->commit();
catch(Exception $e)
try
$pdo->rollBack();
catch(Exception $re)
//...
//...
【问题讨论】:
您是否已将 PDO 配置为在错误时引发异常 但基本上如果你没有提交,事务应该回滚 PDO::rollBack() 在没有先前打开的事务的情况下回滚时抛出PDOException
。
@RiggsFolly 我确实是这样配置的。但是如果准备不抛出并且执行将失败,那么我将提交失败的执行。
@Zeratops 没错,但现在与我无关。我想知道在调用执行时是否应该检查错误,否则在执行失败时会发生其他错误并且不会发生提交,或者如果有任何执行失败,甚至提交本身也会失败。
【参考方案1】:
我假设您基本上是在问,如果执行失败,execute() 会抛出异常吗?
是的,确实如此。
因此您的代码将自动回滚。无需手动检查。例如,您可以使用重复的唯一键错误对其进行测试。
【讨论】:
文档中有关于它的内容吗? 是的。文档说,如果这样配置,PDO 会抛出错误异常。我宁愿问你从哪里得到它只是准备抛出异常。 这是因为文档明确说明 prepare 返回 false,并且只有在 pdo 如此配置时,才会抛出异常。在执行的情况下,它只说它将返回 false,并且没有关于抛出异常的任何内容,所以我会说文档不是随之而来的(?)。 嗯,是的,看起来是这样的。 @Mr_KoKa 当然,你总是可以设置一个执行失败的测试,看看会发生什么以上是关于PHP PDO 执行失败时事务会回滚吗?的主要内容,如果未能解决你的问题,请参考以下文章