Страница 1 из 1

TransactionBehavior

Добавлено: 2013.02.21, 22:06
Ekstazi
TransactionBehavior - поведение, которое позволяет автоматически\вручную обернуть операции между событиями onBeforeSave и onAfterSave в транзакцию.

Использование:
Есть два способа использовать поведение:
1. Простой. Автоматическая транзакция
Подключите поведение к моделе

Код: Выделить всё

public function behaviors()
{
    return array(
        'transaction'=>array(
            'class'=>'ext.transaction.TransactionBehavior',
            'autoStart'=>true
        )
    );
}

public function beforeSave()
{
    parent::beforeSave();
    // операции с бд перед сохранением модели
    return true;
}

public function afterSave()
{
    // операции с бд после сохранения модели
    parent::afterSave();
}
 
затем:

Код: Выделить всё

$model->save();
 
2.
Ручной, классический способ
Подключите поведение к моделе

Код: Выделить всё

public function behaviors()
{
    return array(
        'transaction'=>array(
            'class'=>'ext.transaction.TransactionBehavior',
        )
    );
}

public function beforeSave()
{
    parent::beforeSave();
    // операции с бд перед сохранением модели
    return true;
}

public function afterSave()
{
    // операции с бд после сохранения модели
    parent::afterSave();
}
 
and then:

Код: Выделить всё

$model->saveTransactional();
 
Способы отличаются тем что в первом случае используется магическая обработка ошибок, во втором - стандартная(try{}catch).

Api:
beginTransaction() - окрывает транзакцию
rollback() - откатывает
commit() - коммитит
saveTransaction($validate=true,$attributes=null) - Сохраняет с стандартной try{}catch проверкой. Если что-то не так, то возвращает false
Ссылка - https://github.com/Ekstazi/transactionbehavior

Re: TransactionBehavior

Добавлено: 2013.02.22, 12:06
anton44eg

Код: Выделить всё

public function beforeSave()
{
    parent::beforeSave();
    // операции с бд перед сохранением модели
    return true;
} 
А если родительский beforeSave вернет false?

Re: TransactionBehavior

Добавлено: 2013.02.22, 15:25
Ekstazi
ну тогда можно if(!parent::beforeSave())return false;

Re: TransactionBehavior

Добавлено: 2013.02.22, 15:36
anton44eg
Имхо это нужно в try https://github.com/Ekstazi/transactionb ... or.php#L96 , т.к. именно commit бросает exception

Re: TransactionBehavior

Добавлено: 2013.02.22, 17:16
Ekstazi
Может быть, но в строке 36 по-любому вешается обработчик исключения. Я подумаю над этим.

Re: TransactionBehavior

Добавлено: 2013.02.22, 17:46
anton44eg
т.е. он абсолютно на все ексепшені вешается?

Re: TransactionBehavior

Добавлено: 2013.02.22, 17:56
slavcodev
anton44eg писал(а):т.е. он абсолютно на все ексепшені вешается?
только если начата транзакция, но да, спорное решение

Re: TransactionBehavior

Добавлено: 2013.02.22, 20:29
Ekstazi
Спорное, но обработчик прицуепляется толко на то время пока выполняются транзакционые операции. Сегодня выкачу фикс для commit в saveTransactional

Re: TransactionBehavior

Добавлено: 2014.08.06, 12:37
lnkr-a
День добрый. Извиняюсь за некропост )))
Там баг. Если нужно дважды сохранить один и тот же экземпляр модели с этим поведением, то мы падаем с исключением:
Property "TransactionBehavior._transaction" is not defined.
Почему в методе commit() используется

Код: Выделить всё

unset($this->_transaction);
?
Это же убивает поле и при повторной попытке сохранения при обращении к нему всё падает. Экземпляр класса ведь один и тот же.

Надо бы

Код: Выделить всё

$this->_transaction = null;
Так всё работает как нужно.

Тикет на гитхабе отправил.

Re: TransactionBehavior

Добавлено: 2014.08.06, 17:53
Ekstazi
Хм, пофиксил.

Re: TransactionBehavior

Добавлено: 2014.08.12, 11:32
lnkr-a
Хм. ты rollback() пофиксил, а не commit().
Вроде, стоило бы и там и там...

Re: TransactionBehavior

Добавлено: 2014.08.12, 14:53
Ekstazi
Виноват, исправил.