Какой уровень изоляции транзакций предотвращает Dirty Write?

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

Ответ

READ_COMMITTED и все более строгие уровни (REPEATABLE_READ, SERIALIZABLE) предотвращают Dirty Write (грязную запись).

Почему: Dirty Write возникает, когда две параллельные транзакции изменяют одни и те же данные. Уровень READ_COMMITTED гарантирует, что транзакция не может изменять строку, которая была изменена другой незавершенной транзакцией. Это реализуется через механизмы блокировок или управления версиями данных (MVCC).

Пример на SQL-уровне:

-- Транзакция 1
BEGIN TRANSACTION;
UPDATE users SET name = 'Alice' WHERE id = 1; -- Блокировка строки

-- Транзакция 2 (параллельно)
BEGIN TRANSACTION;
UPDATE users SET name = 'Bob' WHERE id = 1; -- Эта команда будет ждать или завершится с ошибкой, пока транзакция 1 не завершится (COMMIT или ROLLBACK).

Практический вывод: Поскольку Dirty Write — это фундаментальная проблема согласованности, большинство СУБД предотвращают её даже на уровне READ_COMMITTED, который часто используется по умолчанию.