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

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

Ответ

READ UNCOMMITTED — это самый низкий уровень изоляции транзакций в SQL, определенный стандартом ANSI. Он позволяет транзакции видеть незафиксированные изменения ("грязные" данные) других параллельных транзакций.

Основная проблема: Грязное чтение (Dirty Read) Транзакция читает данные, которые были изменены другой транзакцией, но еще не зафиксированы. Если та транзакция откатится, первая прочитает несуществующие данные.

Пример на SQL:

-- Сессия 1 (Транзакция обновления)
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
-- Баланс изменен, но НЕ ЗАФИКСИРОВАН.

-- Сессия 2 (Транзакция чтения с уровнем READ UNCOMMITTED)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN TRANSACTION;
SELECT balance FROM accounts WHERE user_id = 1;
-- Сессия 2 ВИДИТ новое, уменьшенное значение баланса (например, 900),
-- даже если Сессия 1 еще не сделала COMMIT.
COMMIT; -- Сессия 2 фиксирует чтение "грязных" данных.

-- Сессия 1
ROLLBACK; -- Откатывает изменение, баланс возвращается к 1000.
-- В результате: Сессия 2 работала с данными (900), которые никогда не существовали в согласованном состоянии БД.

Когда (очень редко) может использоваться?

  • Для аналитических отчетов, где требуется абсолютная максимальная производительность, а полная точность данных не критична (допустимы приблизительные значения).
  • В сценариях, где данные только читаются и гарантированно не используются для принятия решений, изменяющих состояние.

Почему обычно избегают? Он нарушает базовые гарантии целостности данных (ACID). В большинстве СУБД (как PostgreSQL) READ UNCOMMITTED фактически ведет себя как READ COMMITTED из-за реализации механизмов контроля версий (MVCC).