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

标签 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如果没有事务运行则会抛出异常。

但是有没有可能出现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/

相关文章:

php - 初学者更新记录 PDO 时遇到问题

php - PDO - 如果在 foreach 循环中总是返​​回 else

php - jquery 未将值添加到数据库,readystate=0 和 status=0

php - php 中的一个函数

php - MySql "WHERE"生成器

mysql - 使用绝对 URL 加载 MySQL 文件中的数据

c# - 将库嵌入我的应用程序并使其使用该库

php - 来自数组或逗号分隔的字符串 : get fields from db in just one query

php - 在 PostgreSQL 中使用 PDO 时如何忽略问号作为占位符

php - 将数据从 mySQL 提取到文本文档 php