Поддержка транзакций в СУБД MySQL зависит от используемого движка хранилища данных. Начиная с MySQL 5.5, по умолчанию используется движок InnoDB. InnoDB полностью поддерживает ACID модель транзакций.
Транзакциями можно управлять как средствами SQL, так и вызовами API функций. Для включения и выключения режима автофиксации изменений рекомендуется пользоваться API функциями.
Пример #1 Установка режима автофиксации средствами SQL и функциями API
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
if ($mysqli->connect_errno) {
echo "Не удалось подключиться к MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
/* Рекомендуется управлять настройками транзакций средствами API */
$mysqli->autocommit(false);
/* Не будет распознаваться и учитываться плагинами репликации и балансировки нагрузки */
if (!$mysqli->query('SET AUTOCOMMIT = 0')) {
echo "Не удалось выполнить запрос: (" . $mysqli->errno . ") " . $mysqli->error;
}
?>
Дополнительные службы сервера, такие как плагины репликации и балансировки нагрузки, могут отслеживать вызовы API функций. Плагин репликации может сообщать балансировщику нагрузки о запущенной транзакции, если эта транзакция обслуживается API функциями. Сервер не сможет распределять нагрузку между репликами базы, если смена режима автофиксации, фиксация и откат транзакций осуществляются SQL запросами.
Пример #2 Фиксация и откат
<?php
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->autocommit(false);
$mysqli->query("INSERT INTO test(id) VALUES (1)");
$mysqli->rollback();
$mysqli->query("INSERT INTO test(id) VALUES (2)");
$mysqli->commit();
?>
Следует заметить, что сервер MySQL не может откатить результаты всех запросов. Некоторые изменения фиксируются неявно.
См. также