MySQL InnoDB事务回滚不起作用

时间:2016-10-09 13:44:22

标签: php mysql pdo yii transactions

我遇到了从Yii框架(使用PDO)发送到InnoDB MySql数据库的事务的问题,问题是:回滚无效,更新语句立即提交。

  • 我试着明确地设置autoCommit,没有运气。
  • 检查了Mysql常规日志,只打开了一个Connection,发送了一个Start事务,后来只有一个回滚。
  • 在常规日志中,"开始交易","回滚"并且update语句都来自同一个客户端线程。
  • 整个日志中未找到任何提交。
  • 尝试从mysql客户端(MySQLWorkbench)回滚示例并回滚工作!

问题只是当MySql从Yii应用程序发送并且我不知道原因时立即提交。

由于没有特别的原因,我只是尝试在my.cnf中启用log_bin并且回滚工作!!

有人可以解释一下刚刚发生了什么吗?

我使用的是MySql 5.6.25,PHP 5.6.10和Yii 1.1.14。

更新

事实证明我犯了一个错误,我认为启用log_bin后回滚有效,但它没有。

所以现在我回到原来的问题,回滚不起作用,这里是源代码:

$transaction = Yii::app()->db->beginTransaction();
try {

    $data = array();
    // fill some data here..
    $model = Model::createOrUpdate($data);

    $errors = $model->getErrors();

} catch (Exception $e) {
    $errors []= $e->getMessage();
}

if (empty($errors)) {
    $msg = 'Success message!';
    $transaction->commit();
    echo CJSON::encode(array('success', $msg));
} else {
    if ($transaction->active) {
        $transaction->rollback();
    }
    echo CJSON::encode(array('error', implode(', ', $errors)));
}

Yii::app()->end();

1 个答案:

答案 0 :(得分:0)

经过一些调试后,我发现了背后的原因。 基本上是方法:

Model::createOrUpdate($data);

正在调用存储过程,因此,如果有人遇到此问题,请检查是否已覆盖。