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

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

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

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

Ответы

Ответ 1

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

Чтобы узнать, что произошло, мне пришлось погрузиться в API docs для 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 отслеживает состояние транзакции.

Ответ 2

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

$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')

Ответ 3

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

Этот код не будет корректно работать:

    $this->getAdapter()->getDriver()->getConnection()->beginTransaction();  
    //do some jobs - e.g : 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 - e.g : multiple tables update or insert. 
    $connection->rollback();

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