Yii Framework Forum: Транзакции Бд Между Сервисами - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Транзакции Бд Между Сервисами Rate Topic: -----

#1 User is offline   bFree 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 9
  • Joined: 25-November 12

Posted 12 September 2013 - 09:12 AM

В процессе рефакторинга системы и декомпозиции функционала на отдельные сервисы и службы, возникла интересная проблема.

Предположим, что в системе есть несколько классов-сервисов. Каждый из них содержит методы с реализацией какой-либо бизнес-логики.
Например, есть сервис, отвечающий за добавление платежей в систему биллинга, есть сервис, отвечающий за добавление услуг пользователю.

Дело в том, что каждый метод этого сервиса может использоваться отдельно и независимо из внешнего приложения.
Но в то же время его могут использовать и другие сервисы.

Например при добавлении пользователю услуги получается так (псевдокод, который сочиняю на ходу):
public function addOption($customer) {
   $tr = $this->beginTransaction(); // каким-то образом начинаем транзацию
   
   try {
       /// Дальше создаем модели, выполняем какие-то манипуляции и вызываем другой сервис, который делает свою часть работы
       $AnotherService = getAnotherService();
       $AnotherService->someOperation();
   catch (Exception $e) {
     $tr->rollback();
   }
   $tr->commit();   
}


Проблема заключается в том, что сервис $AnotherService внутри совего метода тоже ибудет использовать транзакцию и коммитить ее. Таким образом получается "вложенная транзакция", которая коммитится во внутреннем сервисе. А вложенные транзакции не поддерживаются.

Не уверен, что понятно сформулировал, но суть именно такая.
Может быть кто-то сталкивался с подобной проблемой?
0

#2 User is offline   Ragazzo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 47
  • Joined: 12-August 12

Posted 12 September 2013 - 03:26 PM

Используйте ENestedPdo (гуглить ENestedPDO+yii) оно использует savepoints, работает только для mysql/postgresq; либо проверяй стартовал ли кто-то уже транзакцию, если нет, то CDbConnection#currentTransaction будет null.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users