Ниже приведен пример кода, который я бегу:Yii 1.1 Операции синхронизации между запросами
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. Теперь, что я ожидаю увидеть? Конечно, я хочу, чтобы модель Loan имела col2 = test4 и col1 = test3, однако я получаю col1 = test3 и col2 = старое значение. Поэтому для меня это говорит о том, что транзакция не сработала.
Если я выбираю модель по-другому, findBySql с добавлением «SELECT ... FOR UPDATE», то транзакция между двумя запросами работает нормально, а testLocks4() ждет testLocks3() для завершения и сохранения информации о модели.
Не могли бы вы объяснить мне или как использовать findByPk с опцией «select ... for» или как сделать транзакцию без нее.
Заранее спасибо.
спасибо, для проверки этого. Могу я спросить вас, какую версию Yii вы используете. Я использую Yii 1 ... Большая разница между Yii1 и Yii2 заключается в том, что в Yii2 у них есть механизм, реализованный в методе model-> save(), чтобы сохранить только измененные поля. –
Я использую Yii 1.1.14. – mo1
Я также использовал MySQL и InnoDB. Так что для меня все еще неясно, что в корне ошибки ... –