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