2013-11-13 3 views
2

Код:Phalcon Mvc Model - откат неудачной транзакции

class myModel extends Phalcon\Mvc\Model 
{ 
    public function beforeSave() 
    { 
     $this->getDi()->getShared('db')->begin(); 
    } 
    ... 
    public function afterSave() 
    { 
     $this->getDi()->getShared('db')->commit(); 
    } 
} 

Мой вопрос - что произойдет, если по пути, между BeforeSave() и afterSave() есть исключения выброшен - Как я могу полностью отменить транзакцию? Где я должен придерживаться $ this-> getDi() -> getShared ('db') -> rollback(); в?

Спасибо!

ответ

3

Я бы рекомендовал полностью перегрузить метод save().

Вот мой пример с транзакциями. Обратите внимание, что вам не понадобятся транзакции, если вы не собираетесь использовать дополнительную логику здесь (например, удаление связанных моделей)

/** 
* Delete old relations before saving new ones 
*/ 
public function save($data=null, $whiteList=null) 
{ 
    $db = $this->getDI()->get('db'); 

    try 
    { 
     // Start transaction 
     $db->begin(); 

     // ... Do some additional work. Remove related models etc... 

     // Update model 
     if (!parent::save($data, $whiteList)) 
      throw new \Exception('Cannot save the model'); 

     $db->commit(); 
    } 
    catch (\Exception $e) 
    { 
     $db->rollback(); 

     $this->appendMessage(new \Phalcon\Mvc\Model\Message($e->getMessage(), '', 'error', $this)); 
     return false; 
    } 
    return true; 
} 
Смежные вопросы