Что такое уровень изоляции транзакций SERIALIZABLE в SQL?

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

Ответ

SERIALIZABLE — это самый строгий уровень изоляции транзакций в SQL, определенный стандартом ANSI. Он гарантирует, что результат параллельного выполнения набора транзакций будет идентичен результату их последовательного выполнения.

Основные гарантии:

  1. Предотвращение всех аномалий: Нет "грязного" чтения, неповторяющегося чтения и фантомного чтения.
  2. Полная изоляция: Транзакция видит данные так, как если бы она была единственной в системе.

Как достигается: СУБД обычно использует блокировки диапазонов (range locks) или механизмы управления версиями строк (MVCC) с проверкой сериализуемости, чтобы предотвратить конфликты.

Пример проблемы, которую решает SERIALIZABLE: Две параллельные транзакции пытаются добавить запись с одинаковым уникальным значением (например, username). При более слабых уровнях изоляции возможна вставка двух одинаковых значений с нарушением уникальности. SERIALIZABLE предотвратит это, сериализовав выполнение транзакций.

Синтаксис (пример для PostgreSQL):

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- Операции SELECT, INSERT, UPDATE, DELETE
COMMIT;

Недостатки:

  • Низкая производительность: Максимальные накладные расходы из-за блокировок или откатов.
  • Риск ошибок сериализации: При конфликте транзакция может завершиться с ошибкой Serialization Failure (или аналогичной), требующей повторной попытки (retry logic).

Когда использовать: Для критически важных операций, где абсолютная корректность данных важнее производительности (например, финансовые операции, бронирование).