Какие уровни изоляции транзакций определены в стандарте SQL?

Ответ

Стандарт SQL (ANSI/ISO) определяет четыре уровня изоляции транзакций, которые контролируют видимость изменений, сделанных в параллельных транзакциях. Они представляют собой компромисс между согласованностью данных и производительностью.

Уровни перечислены от наименее строгого к наиболее строгому, и каждый последующий уровень предотвращает определенные аномалии:

  1. READ UNCOMMITTED:

    • Описание: Транзакция может читать данные, которые были изменены другой транзакцией, но еще не зафиксированы.
    • Разрешенные аномалии: Грязное чтение (Dirty Read), Неповторяющееся чтение (Non-repeatable Read), Фантомное чтение (Phantom Read).
    • На практике: Я практически никогда не использую этот уровень из-за риска чтения невалидных данных.
  2. READ COMMITTED:

    • Описание: Транзакция видит только зафиксированные данные других транзакций. Это уровень по умолчанию в PostgreSQL и Oracle.
    • Предотвращает: Грязное чтение.
    • Разрешенные аномалии: Неповторяющееся чтение, Фантомное чтение.
    • Как работает: При повторном чтении одной и той же строки в рамках транзакции можно получить разные данные, если другая транзакция зафиксировала изменения этой строки.
  3. REPEATABLE READ:

    • Описание: Гарантирует, что любые строки, прочитанные в течение транзакции, будут оставаться неизменными до ее завершения. Другие транзакции не могут изменять или удалять эти строки.
    • Предотвращает: Грязное чтение, Неповторяющееся чтение.
    • Разрешенные аномалии: Фантомное чтение (хотя в некоторых СУБД, например, в MySQL/InnoDB и PostgreSQL, фантомы также предотвращаются на этом уровне).
    • Уровень по умолчанию в MySQL (InnoDB).
  4. SERIALIZABLE:

    • Описание: Самый строгий уровень. Результат параллельного выполнения набора сериализуемых транзакций должен быть идентичен результату их последовательного выполнения.
    • Предотвращает: Все аномалии: Грязное чтение, Неповторяющееся чтение, Фантомное чтение.
    • На практике: Обеспечивает полную изоляцию, но за счет максимальных накладных расходов (блокировок или управления версиями), что может сильно снизить пропускную способность. Я использую его только для критических операций, где абсолютная согласованность важнее производительности.

Пример установки уровня в PostgreSQL:

-- Установка уровня для текущей транзакции
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- Операции SELECT, UPDATE, DELETE...
COMMIT;

-- Установка уровня по умолчанию для сессии
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED;

Выбор уровня зависит от требований приложения к согласованности и допустимых компромиссов с производительностью.

Видео-ответы