Yii事务未能回滚。

3

在下面的示例代码中,Yii事务不会回滚,并且记录已保存在数据库中:

        $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();

有什么想法吗?谢谢。

2个回答

13

使用事务的正确方法是与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并不会影响或改变任何东西。 - hishamaborob
但在这种情况下,您不能同时拥有保存模型、提交事务和回滚事务。成功将数据保存到数据库后再回滚事务是很奇怪的。 - eXtreme
1
尽管这个答案可能没有解决你的问题,但它确实教授了正确的交易方式。这就是为什么应该点赞的原因! - Sankalp Singha

6

请确保您的表格所使用的存储引擎是InnoDB。我认为这是默认情况下唯一一个支持事务安全的引擎。有关可用引擎的更多信息,请参阅mysql文档


是的,现在它完美地运行了。我把我的表引擎从MyISAM改成InnoDB..谢谢你的建议 :) - hishamaborob
你也救了我。工作得很好。 - Turikumwe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接