【问题标题】:MySQL InnoDB transaction rollback is not workingMySQL InnoDB 事务回滚不起作用
【发布时间】:2017-02-18 01:12:43
【问题描述】:

我遇到了从 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();

【问题讨论】:

  • 您执行了哪些查询? MySQL 不知道 DDL-Level-Transactions。
  • 没有执行 DDL,只是一条 Update 语句
  • 显示你的代码..

标签: php mysql pdo yii transactions


【解决方案1】:

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

Model::createOrUpdate($data);

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

【讨论】:

    猜你喜欢
    • 2018-05-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多