Справочное руководство ZF1 Zend_Db содержит полный раздел по выполнению транзакций.
В справочном руководстве ZF2 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. То же самое должно быть во всех транзакционных запросах.