Как 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. То же самое должно быть во всех транзакционных запросах.