Принципы работы транзакций в InnoDB: уровни изоляции и блокировки
Краткое резюме
В статье рассматриваются принципы работы транзакций в InnoDB, уровни изоляции и блокировки. Объясняются распространённые заблуждения, например, что ALTER TABLE можно отменить внутри транзакции, хотя на самом деле DDL инициирует неявный COMMIT.
Для обеспечения стабильной работы транзакций в InnoDB необходимо разбираться в его внутренней логике. Большинство ошибок происходит не из-за отсутствия транзакций, а из-за неправильного понимания принципов работы блокировок и уровней изоляции.
В этой статье мы рассмотрим несколько распространённых заблуждений и на примерах разберём, как на самом деле функционируют транзакции в InnoDB.
**Транзакция: основные принципы**
Транзакция в InnoDB представляет собой набор последовательных операций с базой данных, которые выполняются либо полностью и успешно, либо не выполняются вовсе.
По умолчанию каждая сессия в InnoDB начинается с включённым режимом autocommit, что обеспечивает автоматическую фиксацию изменений сразу после выполнения каждого SQL-запроса.
Для начала явной транзакции используется оператор START TRANSACTION, который откладывает фиксацию изменений до команды COMMIT или ROLLBACK. Это можно рассматривать как временное отключение autocommit.
На этом этапе важно понимать, какие запросы входят в транзакцию и как они взаимодействуют с механизмами InnoDB. Не все запросы ведут себя одинаково внутри транзакции. Например, выполнение ALTER приводит к завершению текущей транзакции и фиксации всех изменений, даже если ожидался откат. Это происходит потому, что DDL не является частью пользовательской транзакции и прерывает её.
**Распространённые заблуждения**
* **Заблуждение:** ALTER TABLE можно отменить, если он выполняется внутри транзакции.
* **Реальность:** DDL инициирует неявный COMMIT.
Также существует заблуждение, что одиночный SELECT выполняется без транзакции. На самом деле, одиночный SELECT также выполняется внутри короткой неявной транзакции.
**Уровни изоляции**
Внутри транзакции данные становятся доступными в соответствии с определёнными правилами, заданными уровнями изоляции. Основные различия между уровнями заключаются в том, как создаётся и используется read view — снимок логически видимого состояния базы данных на момент запроса.
Снимок read view фиксирует список активных транзакций, и при чтении каждая строка проверяется на видимость. Если текущая транзакция не должна видеть последнюю версию строки, InnoDB извлекает предыдущую версию из undo log.
С помощью undo log в InnoDB создаются такие снимки. В журнале хранятся предыдущие версии строк, изменённые в результате операций UPDATE или DELETE. При INSERT старой версии не существует, поэтому в журнале создаётся специальная запись для удаления вставленной строки. Фактически undo log нужен для возможности отменить транзакцию и для предоставления предыдущих версий строк другим транзакциям.
В каждой строке таблицы InnoDB есть несколько служебных полей, связанных с транзакциями. В частности, хранится идентификатор транзакции, которая последний раз изменила строку.