繁体   English   中英

MySQL InnoDB事务回滚不起作用

[英]MySQL InnoDB transaction rollback is not working

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

  • 我尝试显式设置autoCommit,但是没有运气。
  • 检查了Mysql常规日志,只有一个Connection正在打开,发送了一个Start事务,后来又只有一个回滚。
  • 在常规日志中,“开始事务”,“回滚”和更新语句均来自同一客户端线程。
  • 在整个日志中未找到任何提交。
  • 尝试了从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();

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

Model::createOrUpdate($data);

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM