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


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

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

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

Author: Charles, 2012-12-12

3 answers

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

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

Похоже, что beginTransaction, rollback и commit определены в Zend\Db\Адаптер\Драйвер\Интерфейс подключения. Это означает, что они являются методами, вызываемыми для каждого отдельного подключения адаптера. К сожалению, сама связь довольно скрыта.

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

Фу.

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

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

 21
Author: Charles, 2012-12-12 02:44:29

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

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

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

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

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

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

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

$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')
 37
Author: Diemuzi, 2013-02-28 18:43:39

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

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

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

Так как $this->getAdapter()->getDriver()->getConnection() Создает новое соединение с бд.

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

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

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

 8
Author: Mohamad Rostami, 2014-03-09 10:25:32