示例代码:
$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成功但执行失败的情况呢?不会造成回滚吧?当执行失败时提交是否也会抛出(我不这么认为,因为文档说它仅在没有事务时抛出)。
那么我应该显式检查执行结果并抛出自己的异常来导致像这样的回滚吗?:
$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){
//...
}
//...
}
最佳答案
我假设您基本上是在问,如果失败,execute() 是否会抛出异常?
是的,确实如此。
因此您的代码将自动回滚。无需手动检查。例如,您可以使用重复的唯一键错误来测试它。
关于PHP PDO 执行失败时事务会回滚吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41681015/