Перед прочтением этого материала рекомендуем вам ознакомиться со следующими материалами:
Транзакции могут быть использованы только в тех системах хранения данных, которые их поддерживают, например 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()
. Если случится исключение, мы можем откатить все изменения с помощью метода transactionRollback()
.
Это позволяет нам вернуть базу данных к точке старта транзакции или к последней точке сохранения, несмотря на то, что мы уже внесли какие-то изменения в таблицы базы данных.