PHP PDO执行失败时事务会回滚吗?

时间:2017-01-16 16:38:44

标签: php mysql pdo transactions 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将抛出异常。

但是有可能发生这样的情况,即准备会成功但执行失败吗?它不会导致回滚?当执行失败时,提交也会抛出(我不这么认为,因为文档说它只在没有事务时抛出)。

那么我应该显式检查执行结果并抛出我自己的异常导致这样的回滚吗?:

$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){
        //...
    }

    //...
}

1 个答案:

答案 0 :(得分:2)

我认为基本上你在问,如果失败,execute()会抛出异常吗?

是的,确实如此。

因此,您的代码将自动回滚。无需手动检查。例如,您可以使用重复的唯一键错误对其进行测试。