Как ZendDb в ZF2 контролирует транзакции?
Справочное руководство Zend_Db ZF1 содержит целый раздел , посвященный выполнению транзакций.
В справочном руководстве ZF2 Zend\Db отсутствует какая-либо документация по транзакциям.
Как мне выполнять транзакции в ZF2? Пример кода был бы полезен.
3 answers
Любопытна отсутствующая документация.
Чтобы узнать, что произошло, мне пришлось погрузиться в Документы API для Zend\Db\Адаптера.
Похоже, что beginTransaction
, rollback
и commit
определены в Zend\Db\Адаптер\Драйвер\Интерфейс подключения. Это означает, что они являются методами, вызываемыми для каждого отдельного подключения адаптера. К сожалению, сама связь довольно скрыта.
Что мне непонятно - и я не могу привести пример на данный момент - это выяснение того, на каком объекте вы на самом деле вызываете эти методы. В худшем случае, похоже, вы захотите позвонить $adapter->getDriver()->getConnection()->beginTransaction()
.
Фу.
Я надеюсь, что кто-то другой, обладающий большими знаниями и удобной копией 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();
Просто чтобы показать это, вы также можете получить последний идентификатор, созданный:
$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue()
Если вы используете pgSQL, вам нужно будет добавить последовательность, чтобы вернуть последний созданный идентификатор:
$this->getAdapter()->getDriver()->getConnection()->getLastGeneratedValue('mail_mailid_seq')
Есть два вопроса для совершения транзакции.
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.Они должны быть одинаковыми во всех запросах транзакций.