Какие существуют стандартные уровни изоляции транзакций в SQL и чем они характеризуются?

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

Ответ

Уровни изоляции транзакций определяют степень видимости изменений, сделанных в параллельных транзакциях, и защищают от аномалий согласованности. Стандартные уровни (от наименее к наиболее строгому):

  1. READ UNCOMMITTED: Самый низкий уровень.

    • Разрешает: Грязные чтения (Dirty Reads), неповторяющиеся чтения, фантомные чтения.
    • Транзакция видит незафиксированные изменения других транзакций.
  2. READ COMMITTED: Стандартный уровень для многих СУБД (например, PostgreSQL, Oracle).

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

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

    • Предотвращает: Все аномалии — грязные, неповторяющиеся и фантомные чтения.
    • Транзакции изолируются так, как если бы они выполнялись строго последовательно, что может приводить к блокировкам и откатам.

Компромисс: Чем выше уровень изоляции, тем выше целостность данных, но ниже параллелизм и производительность из-за блокировок.