php - MySQL事务,回滚不起作用,(PHP PDO)

标签 php mysql pdo transactions rollback

我有一个循环,在两个表中插入数据,在循环的第一次迭代中插入成功,但在第二次迭代中插入将失败。

我编写了脚本,以便如果任何迭代失败,则应回滚整个事务。但是,这不起作用。

第一次迭代(成功的)不会回滚...

<?php
    include('model/dbcon.model.php');

    $languages = array('project_nl', 'project_en');

    DBCon::getCon()->beginTransaction();

    $rollback = true;

    foreach($languages as $language) {
        $Q = DBCon::getCon()->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)');
        $Q->bindValue(':id', '1', PDO::PARAM_INT);
        $Q->bindValue(':name', 'test', PDO::PARAM_INT);
        $Q->bindValue(':description', 'test', PDO::PARAM_INT);
        $Q->bindValue(':big_image', 'test', PDO::PARAM_INT);

        try {
            $Q->execute();
        } catch (PDOException $e) {
            $rollback = true;
        }
    }

    if ($rollback) {
        echo 'rollbacking...';
        DBCon::getCon()->rollBack();
    } else {
        echo 'commiting...';
        DBCon::getCon()->commit();
    }

?>

为什么整个事务没有回滚?

提前致谢。

最佳答案

要么启用了自动提交,要么连接未持续,或者您没有使用 innodb。

这会起作用,这意味着 DBCon::getCon() 没有做你认为它正在做的事情。

<?php
    include('model/dbcon.model.php');

    $languages = array('project_nl', 'project_en');


    $connection = DBCon::getCon();

    $connection->beginTransaction();

    $rollback = true;

    foreach($languages as $language) {
        $Q = $connection->prepare('INSERT INTO `'.$language.'`(`id`, `name`, `description`, `big_image`) VALUES (:id,:name,:description,:big_image)');
        $Q->bindValue(':id', '1', PDO::PARAM_INT);
        $Q->bindValue(':name', 'test', PDO::PARAM_INT);
        $Q->bindValue(':description', 'test', PDO::PARAM_INT);
        $Q->bindValue(':big_image', 'test', PDO::PARAM_INT);

        try {
            $Q->execute();
        } catch (PDOException $e) {
            $rollback = true;
        }
    }

    if ($rollback) {
        echo 'rollbacking...';
        $connection->rollBack();
    } else {
        echo 'commiting...';
        $connection->commit();
    }

?>

关于php - MySQL事务,回滚不起作用,(PHP PDO),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837066/

相关文章:

php - 如何在 Laravel Mix 中安装 Font Awesome

php - 如何循环遍历 N 级子子数组 - PHP

mysql查询通过比较2个表来获取唯一的缺失值

php - 通过php发布sql查询的结果与通过phpmyadmin发布sql查询的结果不同

php - 使用 PDO 记录带有执行时间的查询 - 自动完成不起作用

php - Laravel 应用程序创建事件来更新数据库表

php - PHP 中的 Base64 编码不适用于 '&' 和 '#' ?

MySQL 无法识别 WHERE 中的日期时间索引

php - 记录集中的循环列

php - 用php连接mysql,在浏览器中查看