Поддержка транзакций в СУБД MySQL зависит от используемого движка хранилища данных. Начиная с MySQL 5.5, по умолчанию используется движок InnoDB. InnoDB полностью поддерживает модель транзакций ACID.
Транзакциями можно управлять как средствами SQL, так и вызовами API-функций.
Для включения и выключения режима автофиксации изменений (autocommit
) рекомендуется
пользоваться API функциями.
Пример #1 Установка режима автофиксации (autocommit
) средствами SQL и функциями API
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
/* Рекомендуется управлять настройками транзакций средствами API */
$mysqli->autocommit(false);
/* Не будет распознаваться и учитываться плагинами репликации и балансировки нагрузки */
$mysqli->query('SET AUTOCOMMIT = 0');
Дополнительные службы сервера, такие как плагины репликации и балансировки
нагрузки, могут отслеживать вызовы API-функций. Плагин репликации может
сообщать балансировщику нагрузки о запущенной транзакции, если эта транзакция
обслуживается API-функциями. Сервер не сможет распределять нагрузку между
репликами базы, если смена режима автофиксации (autocommit
), фиксация и откат транзакций
осуществляются SQL-запросами.
Пример #2 Фиксация и откат
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$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 не может откатить результаты всех запросов. Некоторые изменения фиксируются неявно.
Смотрите также