Данная статья посвящена транзакциям в MySQL (для баз на движке InnoDB). Она основана на официальной документации.
Документация MySQL по транзакциям
Синтаксис транзакций согласно документации выглядит следующим образом
1 2 3 4 5 |
START TRANSACTION [WITH CONSISTENT SNAPSHOT] BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1} |
По умолчанию MySQL запускается в режиме autocommit. Это означает, что как только вы выполните инструкцию, которая обновляет (update) таблицу, MySQL сохраняет изменения на диск. При этом изменения нельзя откатить.
Чтобы неявно отключить autocommit режим для серии инструкций, можно использовать следующий код
1 2 3 4 |
START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT; |
В данном случае MySQL ждет явного COMMIT или ROLLBACK.
Чтобы явно отменить autocommit режим можно написать следующее
1 |
SET autocommit=0; |
Транзакции, которые откатываются, то есть происходит ROLLBACK не сохраняются в логе (BINARY LOG).
Если используются таблицы из более чем одного движка типа transaction-safe (например InnoDB ), то лучше использовать уровень изоляции SERIALIZABLE, иначе могут быть искажения данных.
Уровень изоляции можно менять командой SET TRANSACTION, например так
1 |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE
SAVEPOINT
MySQL поддерживает Savepoint со следующим синтаксисом
1 2 3 |
SAVEPOINT identifier ROLLBACK [WORK] TO [SAVEPOINT] identifier RELEASE SAVEPOINT identifier |
Если текущая транзакция уже имеет savepoint с таким именем, то предыдущая savepoint удаляется и новая устанавливается.
Инструкция ROLLBACK TO SAVEPOINT откатывает транзакцию к именованной точке без уничтожения транзакции. Изменения, которые данная транзакция сделала для рядов после savepoint отменяются, но InnoDB не освобождает заблокированные ряды после savepoint.
Все savepoints текущих транзакций удаляются если вы выполняете COMMIT или ROLLBACK. Новый уровень savepoint создается когда хранимая функция вызывается триггером. Savepoints предыдущих уровней становятся недоступными и таким образом не конфликтуют с новыми. Когда функция или триггер уничтожаются, любые SAVEPOINTS созданные ими удаляются и восстанавливается предыдущий уровень savepoint.