【问题标题】:Yii transaction doen't roll backYii 事务不回滚
【发布时间】:2013-10-14 14:37:07
【问题描述】:

在下面的示例代码中,Yii 事务不会回滚并保存在 DB 中的记录:

        $transaction = Yii::app()->db->beginTransaction();
        $mode_1 = new Orders;
        $mode_1->id_order = 3333;
        $mode_1->AWB = 3333;
        $mode_2 = new Orders;
        $mode_2->id_order = 4444;
        $mode_2->AWB = 4444;
        $mode_2->save();
        $mode_1->save();
    $transaction->rollback();

有什么想法吗? ..谢谢

【问题讨论】:

标签: php mysql activerecord yii transactions


【解决方案1】:

使用事务的正确方法是将它们与 try-catch 构造一起使用。在您的示例中,我认为问题出现是因为您没有进行提交 ($transaction->commit())。

$transaction = Yii::app()->db->beginTransaction();
try {
    if (!$model->save()) {
        throw new Exception('Model cannot be saved.');
    }
    if (!$anothermodel->save()) {
        throw new Exception('Anothermodel cannot be saved.');
    }

    $transaction->commit();
} catch (Exception $e) {
    $transaction->rollback();
}

编辑: $model->save() 不会抛出异常,所以你需要抛出它!

【讨论】:

  • 实际上放置 try-catch 不会影响或改变任何东西。
  • 但是在这种情况下你不能同时拥有保存模型、提交事务和回滚事务。而且成功将数据保存到DB并在数据回滚后进行事务处理也很奇怪。
  • 虽然这个答案可能没有解决你的问题,但是这个答案正在教导正确的交易方式。这就是在那里投票的原因!
【解决方案2】:

确保您的表的存储引擎是 InnoDB。我相信它是默认情况下唯一可用的事务安全引擎。在mysql docs 中了解更多关于可用引擎的信息

【讨论】:

  • 是的,它现在运行良好。我将表引擎从 MyISAM 更改为 InnoDB .. 谢谢您的建议 :)
  • 你也救了我。像魅力一样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 2012-07-13
  • 2013-12-15
  • 2011-01-26
  • 2017-03-03
  • 2012-03-10
相关资源
最近更新 更多