以下是我运行的示例代码:
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'选项 或如何在没有它的情况下使交易工作。
提前致谢。
答案 0 :(得分:1)
我重新创建了你的方法并得到了你期望的结果。我使用了MySQL和InnoDB。
您是否验证数据库是否支持交易? Yii不会告诉您不支持交易,例如,如果您使用的是MYISAM-Tables。
请注意,在代码中$ loan-> save()之后会丢失分号。