Транзакции являются механизмами обеспечения целостности БД, особенно при ошибках или отказе сервера.
Определение транзакций
Транзакция – это запрос или их набор, который полностью будет выполнен в БД или не будет выполнен совсем. В итоге сохраняется целостность БД вне зависимости от успешности завершения транзакции.
Рассмотрим важность такой возможности на примере банковской базы данных. Пусть нужно перевести деньги с одного счета на другой. Т.е. предполагается снятие денег с одного счета и перенесение их на другой, для чего необходимо выполнение не менее двух запросов. Представим ситуацию, когда деньги уже сняты с одного счета, но потеря напряжения произошла раньше, чем они переместились на другой счет. «Исчезнут» ли деньги в таком случае?
Транзакции должны удовлетворять четырем требованиям, которые описываются понятием соответствия ACID (постоянство, изоляция, целостность, атомарность):
- Атомарность – транзакция должна выполняться полностью или не выполняться совсем.
- Целостность – после проведения транзакции база данных должна оставаться в целостном состоянии.
- Изоляция – пока транзакции не завершены, они должны быть изолированными, т.е. их не должны видеть другие пользователи базы данных.
- Постоянство – итоги выполнения транзакции после их сохранения в БД должны быть постоянными и долговременными.
Подтвержденной называют транзакцию, итог выполнения которой записан в БД.
Откатанной называют транзакцию, итог выполнения которой не записан в БД (БД вернулась в прежнее состояние, в каком была до начала выполнения транзакции).
Использование транзакции в сочетании с таблицами InnoDB
MySQL по умолчанию работает в режиме автоматического подтверждения. Т.е. результат выполнения каждого оператора сразу записывается в БД (подтверждается).
Для отключения режима автоматического подтверждения в текущем сеансе нужно ввести команду:
При включенном режиме автоматического подтверждения транзакция должна начинаться с оператора
При отключенном режиме автоматического подтверждения данная команда не нужна, т.к. транзакция автоматически запускается после ввода оператора SQL.
После завершения ввода операторов, которые образуют транзакцию, их подтверждают в базе данных следующей командой:
commit;
К предыдущему состоянию БД можно вернуться командой:
rollback;
До подтверждения транзакции она не будет видна в других сеансах или другими пользователями.
Пример.
Преобразуем 2 таблицы orders и order_items базы данных в таблицы InnoDB:
alter table orders type = innodb;
alter table order_items type = innodb;
Для обратного преобразования при необходимости можно воспользоваться этим же оператором, но с параметром type = MyISAM.
Откроем 2 соединения с базой данных. В одном из них добавим новую запись заказа:
insert into orders values (5, 1, 400.00, '2016-08-15');
insert into order_items values (5, '0-2-1', 1);
Проверим видимость нового заказа:
*select from orders where orderid = 5;**
Заказ должен отображаться в выходной информации:
При открытом текущем состоянии нужно перейти к другому соединению и выполнить такой же запрос select. Заказ не должен быть отображен в выводе. Если заказ отображается, значит не был отключен режим автоматического подтверждения или таблица не была преобразована в формат InnoDB. Это обусловлено тем, что транзакция еще не подтверждена.
Для исправления ситуации нужно вернуться к первому соединению и подтвердить транзакцию:
commit;
Если все сделано правильно, соответствующая строка должна быть отображена в выводе и во втором соединении.