Как Zend \ Db в ZF2 контролирует транзакции?

Справочное руководство ZF1 Zend_Db содержит полный раздел по выполнению транзакций.

В справочном руководстве ZF2 Zend \ Db отсутствует документация по транзакциям.

Как выполнять транзакции в ZF2? Пример кода будет полезен.

Solutions Collecting From Web of "Как Zend \ Db в ZF2 контролирует транзакции?"

Недостающая документация любопытна.

Чтобы узнать, что произошло, мне пришлось погрузиться в документы API для Zend \ Db \ Adapter.

Похоже, что beginTransaction , rollback и commit определены в Zend \ Db \ Adapter \ Driver \ ConnectionInterface . Это означает, что они являются методами, которые можно вызывать при каждом подключении адаптера. К сожалению, сама связь довольно похожа.

То, что я не понимаю, и не может представить пример в это время, – это выяснить, на какой объект вы на самом деле называете эти методы. В худшем случае, похоже, вы можете назвать $adapter->getDriver()->getConnection()->beginTransaction() .

Eww.

Я надеюсь, что кто-то еще с большим количеством знаний, а копия ZF2 будет удобной, увидит это и предоставит лучший вариант.

Не забывайте, что вы можете просто самостоятельно выполнить BEGIN TRANSACTION / ROLLBACK / COMMIT / SET autocommit=... SQL. Вероятно , это нормально, так как это не похоже, что Zend \ Db отслеживает состояние транзакции.

У тебя вышло. Правильный способ начать, совершить и отменить транзакции выглядит следующим образом:

 $this->getAdapter()->getDriver()->getConnection()->beginTransaction(); $this->getAdapter()->getDriver()->getConnection()->commit(); $this->getAdapter()->getDriver()->getConnection()->rollback(); 

Просто чтобы поместить это там, вы также можете получить Last ID, созданный:

 $this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue() 

Если вы используете pgSQL, вам нужно будет добавить последовательность, чтобы вернуть последний идентификатор:

 $this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq') 

Для совершения транзакции есть два вопроса.
1 – MyISAM не является транзакционным движком, поэтому измените систему таблиц на InnoDB.
2 – Запрос транзакции ( "START TRANSACTION;" или "ROLLBACK;" ) соединение должно быть одинаковым с другими запросами (Insert или Update).
Для этого в ZF2 вы должны получить текущий адаптер db и использовать его во всех запросах.

Этот код не будет работать правильно:

  $this->getAdapter()->getDriver()->getConnection()->beginTransaction(); //do some jobs - eg : multiple tables update or insert. $this->getAdapter()->getDriver()->getConnection()->rollback(); 

Поскольку $this->getAdapter()->getDriver()->getConnection() Создает новое соединение db.

Вместо этого используйте следующий код:

  $connection = $this->getAdapter()->getDriver()->getConnection(); $connection->beginTransaction(); //do some jobs - eg : multiple tables update or insert. $connection->rollback(); 

Чтобы проверить правильность ваших соединений, просто включите журнал запросов в mysql.
После выполнения запроса вы увидите номер соединения перед каждым запросом в журнале mysql. То же самое должно быть во всех транзакционных запросах.