TransactionBehavior

Выкладываем свои наработки
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

TransactionBehavior

Сообщение 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

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: TransactionBehavior

Сообщение anton44eg »

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

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

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: TransactionBehavior

Сообщение Ekstazi »

ну тогда можно if(!parent::beforeSave())return false;

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: TransactionBehavior

Сообщение anton44eg »

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

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: TransactionBehavior

Сообщение Ekstazi »

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

Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: TransactionBehavior

Сообщение anton44eg »

т.е. он абсолютно на все ексепшені вешается?

Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: TransactionBehavior

Сообщение slavcodev »

anton44eg писал(а):т.е. он абсолютно на все ексепшені вешается?
только если начата транзакция, но да, спорное решение
Жду Yii 3!

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: TransactionBehavior

Сообщение Ekstazi »

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

lnkr-a
Сообщения: 5
Зарегистрирован: 2014.06.24, 16:12

Re: TransactionBehavior

Сообщение lnkr-a »

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

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

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

Надо бы

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

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

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

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: TransactionBehavior

Сообщение Ekstazi »

Хм, пофиксил.

lnkr-a
Сообщения: 5
Зарегистрирован: 2014.06.24, 16:12

Re: TransactionBehavior

Сообщение lnkr-a »

Хм. ты rollback() пофиксил, а не commit().
Вроде, стоило бы и там и там...

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: TransactionBehavior

Сообщение Ekstazi »

Виноват, исправил.

Ответить