Yii 1.1事务请求之间同步

时间:2015-06-15 16:37:11

标签: php yii transactions

以下是我运行的示例代码:

public function actionTestLocks3()
{
    $transaction = Yii::app()->db->beginTransaction();
    try {
        $loan = Loan::model()->findByPk(1);
        $loan->col1 = "test3";
        sleep(10);
        $loan->save()
        $transaction->commit();
    } catch (Exception $e) {
        $transaction->rollBack();
        throw($e);
        // other actions to perform on fail (redirect, alert, etc.)
    }
    echo 'done';
}

public function actionTestLocks4()
{
    $transaction = Yii::app()->db->beginTransaction();
    try {
        $loan = Loan::model()->findByPk(1);
        $loan->col2 = "test4";
        $loan->save();
        $transaction->commit();
    } catch (Exception $e) {
        $transaction->rollBack();
        throw($e);
    }
    echo 'done';
}

我有两个动作,我以非常小的间隔(约1秒)运行它们。首先我运行TestLocks3然后运行TestLocks4。 现在,我期待看到什么?当然我想看看贷款模型有col2 = test4和col1 = test3,但我得到的是col1 = test3和col2 =旧值。所以对我来说它告诉交易不起作用。

如果我以不同的方式选择模型,findBySql添加了' SELECT ... FOR UPDATE'然后两个请求之间的事务工作正常,testLocks4()等待testLocks3()完成并保存模型信息。

你能解释我吗? 如何使用findByPk' select ... for'选项 或如何在没有它的情况下使交易工作。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我重新创建了你的方法并得到了你期望的结果。我使用了MySQL和InnoDB。

您是否验证数据库是否支持交易? Yii不会告诉您不支持交易,例如,如果您使用的是MYISAM-Tables。

请注意,在代码中$ loan-> save()之后会丢失分号。