MySQLi - Транзакции

Транзакция - это последовательная группа операций манипулирования базой данных, которая выполняется, как если бы это была одна единая работа. Другими словами, транзакция никогда не будет завершена, если каждая отдельная операция в группе не будет успешной. Если какая-либо операция внутри транзакции завершится неудачно, вся транзакция завершится ошибкой.

Фактически вы объедините множество SQL-запросов в группу и будете выполнять их все вместе как часть транзакции.

Свойства транзакций

Транзакции имеют следующие четыре стандартных свойства, обычно обозначаемых аббревиатурой ACID -

  • Atomicity- обеспечивает успешное завершение всех операций внутри единицы работы; в противном случае транзакция прерывается в момент сбоя, а предыдущие операции возвращаются в исходное состояние.

  • Consistency - гарантирует, что база данных правильно меняет состояния после успешно совершенной транзакции.

  • Isolation - позволяет транзакциям работать независимо и прозрачно друг для друга.

  • Durability - гарантирует, что результат или эффект зафиксированной транзакции сохранится в случае сбоя системы.

В MySQL транзакции начинаются с оператора BEGIN WORK и заканчиваются оператором COMMIT или ROLLBACK. Команды SQLi между начальным и конечным операторами составляют основную часть транзакции.

COMMIT и ROLLBACK

Эти два ключевых слова Commit и Rollback в основном используются для транзакций MySQL.

  • Когда успешная транзакция завершается, следует подать команду COMMIT, чтобы изменения во всех задействованных таблицах вступили в силу.

  • Если происходит сбой, следует подать команду ROLLBACK, чтобы вернуть каждую таблицу, на которую имеется ссылка в транзакции, в ее предыдущее состояние.

Вы можете контролировать поведение транзакции, установив переменную сеанса с именем AUTOCOMMIT. Если для AUTOCOMMIT установлено значение 1 (по умолчанию), то каждый оператор SQL (в рамках транзакции или нет) считается завершенной транзакцией и фиксируется по умолчанию после ее завершения. Когда AUTOCOMMIT установлен в 0, при вводе команды SET AUTOCOMMIT = 0 последующая серия операторов действует как транзакция, и никакие действия не фиксируются, пока не будет выдан явный оператор COMMIT.

Вы можете выполнять эти команды SQL в PHP, используя mysqli_query() функция.

Общий пример транзакции

Эта последовательность событий не зависит от используемого языка программирования; логический путь может быть создан на любом языке, который вы используете для создания своего приложения.

Вы можете выполнять эти команды SQL в PHP, используя mysqli_query() функция.

  • Начните транзакцию, введя команду SQL BEGIN WORK.

  • Выполните одну или несколько команд SQL, например SELECT, INSERT, UPDATE или DELETE.

  • Проверьте, нет ли ошибок и все ли соответствует вашим требованиям.

  • Если есть какая-либо ошибка, введите команду ROLLBACK, в противном случае введите команду COMMIT.

Безопасные для транзакций типы таблиц в MySQLi

Вы не можете использовать транзакции напрямую, вы можете, но они не будут безопасными и гарантированными. Если вы планируете использовать транзакции в программировании MySQLi, вам необходимо создавать свои таблицы особым образом. Есть много типов таблиц, которые поддерживают транзакции, но наиболее популярным из них являетсяInnoDB.

Поддержка таблиц InnoDB требует определенного параметра компиляции при компиляции MySQLi из исходного кода. Если ваша версия MySQLi не поддерживает InnoDB, попросите своего интернет-провайдера создать версию MySQLi с поддержкой типов таблиц InnoDB или загрузите и установите двоичный дистрибутив MySQL-Max для Windows или Linux / UNIX и работайте с типом таблицы в среда разработки.

Если ваша установка MySQLi поддерживает таблицы InnoDB, просто добавьте TYPE = InnoDBопределение к оператору создания таблицы. Например, следующий код создает таблицу InnoDB с именем tutorials_innodb -

root@host# mysql -u root -p;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tutorials_innodb
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)

Проверьте следующую ссылку, чтобы узнать больше о - InnoDB

Вы можете использовать другие типы таблиц, например GEMINI или же BDB, но это зависит от вашей установки, поддерживает ли она эти два типа.