【发布时间】: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 没错,但现在与我无关。我想知道在调用执行时是否应该检查错误,否则在执行失败时会发生其他错误并且不会发生提交,或者如果有任何执行失败,甚至提交本身也会失败。
标签: php mysql pdo transactions execute