JDatabaseDriver - использование транзакций
Перед прочтением этого материала рекомендуем вам ознакомиться со следующими материалами:
Транзакции могут быть использованы только в тех системах хранения данных, которые их поддерживают, например InnoDB. Все базовые таблицы Joomla CMS (начиная с версии 3) используют InnoDB, однако, разработчики сторонних расширений могут их не использовать.
Транзакции доступны для использования начиная с Joomla 3. Их поддержка осуществляется с помощью трех методов, которые реализуются в подклассах класса JDatabaseDriver:
transactionStart($asSavepoint = false)
– стартовая точка транзакции. Если параметр$asSavepoint
установлен вtrue
и транзакция уже активна, то вместо начала транзакции будет создана точка сохранения.transactionCommit($toSavepoint = false)
– коммит транзакции. Если параметр$toSavepoint
установлен вtrue
, коммит будет произведен в последнюю точку сохранения.transactionRollback($toSavepoint = false)
– откат транзакции. Если параметр$toSavepoint
установлен вtrue
, откат будет произведен в последнюю точку сохранения.
Ниже приведен пример использования транзакции:
$db = JFactory::getDbo(); try { $db->transactionStart(); $query = $db->getQuery(true); $values = array( $db->quote('CONSTANT'), $db->quote('Some string'), $db->quote('Joomla is awesome!') ); $query->insert($db->quoteName('#__some_table')); $query->columns( $db->quoteName( array( 'constant', 'string', 'title' ) ) ); $query->values(implode(',', $values)); $db->setQuery($query) ->execute(); $db->transactionCommit(); } catch (Exception $e) { $db->transactionRollback(); JFactory::getApplication()->enqueueMessage($e->getMessage(), 'error'); }
Все, что находится между методами transactionStart()
и transactionCommit()
не будет выполнено до тех пор, пока не будет вызван метод transactionCommit()
. Если случится исключение, мы можем откатить все изменения с помощью метода transactionRollback()
.
Это позволяет нам вернуть базу данных к точке старта транзакции или к последней точке сохранения, несмотря на то, что мы уже внесли какие-то изменения в таблицы базы данных.