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

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

Ответ

Уровни изоляции определяют, насколько транзакции изолированы друг от друга, балансируя между согласованностью данных и производительностью. Стандарт SQL определяет 4 уровня, от наименее к наиболее строгим.

Уровни изоляции и предотвращаемые аномалии:

Уровень изоляции Грязное чтение (Dirty Read) Неповторяемое чтение (Non-repeatable Read) Фантомное чтение (Phantom Read)
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE

Описание уровней:

  1. READ UNCOMMITTED: Транзакция видит незафиксированные изменения других транзакций ("грязные" данные). Самый низкий уровень, может привести к несогласованности.
  2. READ COMMITTED: Гарантирует, что транзакция читает только зафиксированные данные. Это уровень по умолчанию в PostgreSQL, Oracle, SQL Server.
  3. REPEATABLE READ: Гарантирует, что если строка прочитана дважды в одной транзакции, ее значение не изменится. Однако могут появиться новые строки ("фантомы"). Уровень по умолчанию в MySQL InnoDB.
  4. SERIALIZABLE: Самый строгий уровень. Эмулирует последовательное выполнение транзакций, полностью предотвращая все аномалии. Часто использует блокировки, что снижает параллелизм.

Использование в Java (Spring):

import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(isolation = Isolation.READ_COMMITTED)
public void transferMoney(Long fromId, Long toId, BigDecimal amount) {
    // Логика перевода
}

Важно: Фактическая реализация и поведение уровней изоляции могут отличаться в разных СУБД (например, в MySQL REPEATABLE READ предотвращает и фантомы). Всегда сверяйтесь с документацией вашей базы данных.