2015-12-09 3 views
1

Интересно, стоит ли начинать транзакцию.Yii транзакция, с которого начать

Пример 1:

  $transaction = Yii::app()->db->beginTransaction(); 
      try 
      { 
       $savedSuccessfully = $object->save(); 
       $transaction->commit(); 
      } 
      catch (Exception $ex) 
      { 

       $transaction->rollBack(); 
       $result = $e->getMessage();      
      } 

Пример 2:

  $transaction = Yii::app()->db->beginTransaction(); 
      try 
      { 
       $object = $model()::model()->findByPk(1); //!!!!!!! - line 
      // what makes the difference 
       $savedSuccessfully = $object->save(); 
       $transaction->commit(); 
      } 
      catch (Exception $ex) 
      { 

       $transaction->rollBack(); 
       $result = $e->getMessage();      
      } 

Должен ли транзакция быть запущена до выбора данных из БД или или непосредственно перед обновлением/вставки данных? Неужели я позабочусь об этом вместо меня?

Thanks

+0

как вы инициализируете свой объект транзакции $? –

+0

ах, я забыл о самой важной части. Добавлено – Tebe

+0

, которое начнет вашу транзакцию –

ответ

0

Пример 2 был бы решением проблемы.

Получив модель в рамках транзакции, вы убедитесь, что она соответствует вашим изменениям.

Если вы извлекли модель, как в примере 1, за пределами транзакции, другие потоки/пользователи могли изменить соответствующую запись базы данных, прежде чем совершать изменения. Таким образом, вы можете получить потенциально непоследовательные данные.

+0

Я тоже это чувствую. Но я не могу найти ни одного документа yii, в котором говорилось бы, что предпочтительным является второй способ. Это просто моя догадка. Что, если yii проверит, соответствуют ли данные текущей модели и таким образом безопасно использовать первый подход? – Tebe

0

Фактически 2-й вариант является правильным, если вы сохраняете данные, которые являются более критичными, как банковские операции или платежная система, тогда пример 2 является очень правильным. например, вы делаете такой код.

insert into table 1 
select from table 1 
insert into table 2 
update table 2 
select from table 1. 

поэтому, если вы сначала начнете транзакцию, он откатится от всего запроса, если какой-либо запрос завершится неудачно, что будет более эффективным. например, в онлайн-платежной системе.