Что такое уровни изоляции транзакций в базах данных?

«Что такое уровни изоляции транзакций в базах данных?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Уровни изоляции транзакций — это стандартный механизм (определяемый в SQL стандарте ANSI/ISO), который регулирует, насколько изменения, сделанные одной транзакцией, видны другим параллельным транзакциям. Более высокий уровень изоляции повышает целостность данных, но снижает производительность из-за увеличения блокировок.

Стандартные уровни изоляции (от низшего к высшему):

  1. READ UNCOMMITTED:

    • Описание: Транзакция может читать незафиксированные данные («грязные» данные) из других транзакций.
    • Допустимые аномалии: Грязное чтение, неповторяемое чтение, фантомное чтение.
  2. READ COMMITTED (наиболее распространенный по умолчанию, например, в PostgreSQL, Oracle):

    • Описание: Транзакция видит только зафиксированные данные других транзакций.
    • Допустимые аномалии: Неповторяемое чтение, фантомное чтение.
  3. REPEATABLE READ (по умолчанию в MySQL InnoDB):

    • Описание: Гарантирует, что данные, прочитанные один раз в рамках транзакции, не изменятся при повторном чтении (другие транзакции не могут их изменить).
    • Допустимые аномалии: Фантомное чтение (в некоторых СУБД, например MySQL с InnoDB, предотвращается за счёт механизма контроля версий).
  4. SERIALIZABLE (самый строгий):

    • Описание: Полная изоляция. Результат параллельного выполнения транзакций эквивалентен их последовательному выполнению. Достигается за счёт строгих блокировок.
    • Допустимые аномалии: Нет.

Пример настройки в SQL:

-- Установка уровня изоляции для текущей сессии/транзакции
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- Начало транзакции
BEGIN;
-- ... операции с данными ...
COMMIT;

Почему это важно? Выбор уровня изоляции — это компромисс между целостностью данных (консистентностью) и производительностью (параллелизмом). Приложение должно выбирать минимально достаточный уровень для своей бизнес-логики.