MySQL. Транзакции и Savepoint. Из документации

Данная статья посвящена транзакциям в MySQL (для баз на движке InnoDB). Она основана на официальной документации.

Документация MySQL по транзакциям

Синтаксис транзакций согласно документации выглядит следующим образом

По умолчанию MySQL запускается в режиме autocommit. Это означает, что как только вы выполните инструкцию, которая обновляет (update) таблицу, MySQL сохраняет изменения на диск. При этом изменения нельзя откатить. 

Чтобы неявно отключить autocommit режим для серии инструкций, можно использовать следующий код

В данном случае MySQL ждет явного COMMIT или ROLLBACK.

Чтобы явно отменить autocommit режим можно написать следующее

Транзакции, которые откатываются, то есть происходит ROLLBACK не сохраняются в логе (BINARY LOG).

Если используются таблицы из более чем одного движка типа transaction-safe (например InnoDB ), то лучше использовать уровень изоляции SERIALIZABLE, иначе могут быть искажения данных.

Уровень изоляции можно менять командой  SET TRANSACTION, например так


SAVEPOINT, ROLLBACK TO SAVEPOINT, and RELEASE
SAVEPOINT

MySQL поддерживает Savepoint со следующим синтаксисом

Если текущая транзакция уже имеет savepoint с таким именем, то предыдущая savepoint удаляется и новая устанавливается.

Инструкция ROLLBACK TO SAVEPOINT откатывает транзакцию к именованной точке без уничтожения транзакции. Изменения, которые данная транзакция сделала для рядов после savepoint отменяются, но InnoDB не освобождает заблокированные ряды после savepoint.

Все savepoints текущих транзакций удаляются если вы выполняете COMMIT или ROLLBACK. Новый уровень savepoint создается когда хранимая функция вызывается триггером. Savepoints предыдущих уровней становятся недоступными и таким образом не конфликтуют с новыми. Когда функция или триггер уничтожаются, любые SAVEPOINTS созданные ими удаляются и восстанавливается предыдущий уровень savepoint.