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() 失败,它会抛出异常吗?

是的,确实如此。

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