Что такое чтение незафиксированных данных (Dirty Read) в контексте транзакций?

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

Ответ

Чтение незафиксированных данных (Dirty Read) — это аномалия, при которой транзакция видит изменения, сделанные другой, еще не завершенной транзакцией. Если та транзакция откатится, первая прочитает несуществующие данные.

Управление через уровни изоляции (ANSI SQL):

Уровень изоляции Dirty Read Пояснение
READ UNCOMMITTED Разрешен Самый низкий уровень. Транзакции видят незафиксированные изменения других. Риск несогласованности.
READ COMMITTED Запрещен Стандартный уровень в многих СУБД. Гарантирует, что читаются только зафиксированные данные.
REPEATABLE READ и SERIALIZABLE Запрещен Более строгие уровни, решающие и другие аномалии.

Пример на SQL:

-- Сессия 1
BEGIN TRANSACTION;
UPDATE accounts SET balance = 1500 WHERE user_id = 1; -- Не COMMIT еще!

-- Сессия 2 (с уровнем READ UNCOMMITTED)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT balance FROM accounts WHERE user_id = 1; -- Увидит 1500 (Dirty Read)!

-- Если Сессия 1 сделает ROLLBACK, баланс на самом деле останется старым.

Вывод: READ UNCOMMITTED используется крайне редко (например, для агрегатных аналитических запросов, где точность не критична). В большинстве приложений используется READ COMMITTED или строже.