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

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

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

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

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

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

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

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

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

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

COMMIT и ROLLBACK

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

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

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

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

Когда AUTOCOMMIT установлен в 0, путем выдачи SET AUTOCOMMIT = 0 команда, последующая серия операторов действует как транзакция, и никакие действия не фиксируются, пока не будет выпущен явный оператор COMMIT.

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

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

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

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

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

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

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

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

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

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

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

Если ваша установка MySQL поддерживает таблицы InnoDB, просто добавьте TYPE = InnoDB определение к оператору создания таблицы.

Например, следующий код создает таблицу InnoDB с именем tcount_tbl -

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

mysql> use TUTORIALS;
Database changed

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

Для получения дополнительных сведений о InnoDB вы можете щелкнуть следующую ссылку - InnoDB

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