Что такое уровни изоляции транзакций в SQL и какие проблемы они решают?

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

Ответ

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

Основные проблемы, которые решаются:

  1. Грязное чтение (Dirty Read): Чтение незафиксированных данных другой транзакции, которые могут быть откатаны.
  2. Неповторяющееся чтение (Non-repeatable Read): Получение разных значений одного и того же поля при повторном чтении в рамках одной транзакции (данные изменила другая транзакция).
  3. Фантомное чтение (Phantom Read): Появление новых строк или исчезновение существующих при повторном выполнении одного и того же запроса (другая транзакция добавила или удалила строки).

Уровни изоляции (от наименьшей к наибольшей):

Уровень Грязное чтение Неповторяющееся чтение Фантомное чтение Производительность
READ UNCOMMITTED ❌ Возможно ❌ Возможно ❌ Возможно Высокая
READ COMMITTED ✅ Запрещено ❌ Возможно ❌ Возможно Средняя
REPEATABLE READ ✅ Запрещено ✅ Запрещено ❌ Возможно* Ниже средней
SERIALIZABLE ✅ Запрещено ✅ Запрещено ✅ Запрещено Низкая

*В некоторых СУБД (например, MySQL/InnoDB) уровень REPEATABLE READ также предотвращает фантомы.

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

Connection conn = dataSource.getConnection();
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

Выбор уровня: READ COMMITTED — разумный баланс по умолчанию. SERIALIZABLE — для критически важных финансовых операций, где важна абсолютная согласованность.