PHP PDO执行失败会回滚事务吗?
PHP PDO Will transaction rollback when execute fails?
示例代码:
$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){
//...
}
//...
}
我假设基本上你是在问,如果 execute() 失败,它会抛出异常吗?
是的,确实如此。
因此您的代码将自动回滚。无需手动检查。例如,您可以使用重复的唯一键错误对其进行测试。
示例代码:
$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){
//...
}
//...
}
我假设基本上你是在问,如果 execute() 失败,它会抛出异常吗?
是的,确实如此。
因此您的代码将自动回滚。无需手动检查。例如,您可以使用重复的唯一键错误对其进行测试。