2015-06-15 2 views
1

Ниже приведен пример кода, который я бегу: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» или как сделать транзакцию без нее.

Заранее спасибо.

ответ

1

Я воссоздал ваш подход и получил именно тот результат, которого вы ожидали. Я использовал MySQL и InnoDB.

Вы подтвердили, что ваша база данных поддерживает транзакции? Yii не скажет вам, что транзакции не поддерживаются, например, если вы используете таблицы MYISAM.

Обратите внимание, что в вашем коде отсутствует точка с запятой после $ loan-> save().

+0

спасибо, для проверки этого. Могу я спросить вас, какую версию Yii вы используете. Я использую Yii 1 ... Большая разница между Yii1 и Yii2 заключается в том, что в Yii2 у них есть механизм, реализованный в методе model-> save(), чтобы сохранить только измененные поля. –

+0

Я использую Yii 1.1.14. – mo1

+0

Я также использовал MySQL и InnoDB. Так что для меня все еще неясно, что в корне ошибки ... –

Смежные вопросы