Что такое Dirty Write (аномалия в базах данных)?

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

Ответ

Dirty Write — это аномалия параллельного доступа, когда одна транзакция перезаписывает незафиксированные изменения другой, еще не завершенной транзакции. Это нарушает изоляцию и может привести к потере обновлений и неконсистентности данных.

Пример сценария:

-- Транзакция T1 (перевод 100 у.е.)
BEGIN; -- Уровень изоляции READ COMMITTED или ниже
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- balance для id=1 теперь, например, 900 (но НЕ ЗАКОММИТЕНО!)

-- Транзакция T2 (параллельно, начисление 50 у.е.)
BEGIN;
UPDATE accounts SET balance = balance + 50 WHERE id = 1; -- DIRTY WRITE!
-- T2 читает незакоммиченный balance=900, добавляет 50, записывает 950
COMMIT; -- T2 фиксирует balance = 950

-- Транзакция T1 продолжает работу...
-- ... и выполняет COMMIT.
-- Результат: balance = 900 - 100 = 800. Изменение T2 ( +50 ) ПОТЕРЯНО.

Как предотвращается:

  • Механизмы СУБД: Большинство СУБД (PostgreSQL, Oracle, MySQL с InnoDB) предотвращают Dirty Write даже на самом низком уровне изоляции (READ UNCOMMITTED) с помощью эксклюзивных блокировок строк (X-locks) или MVCC.
  • Уровни изоляции в JDBC: Установка уровня TRANSACTION_READ_COMMITTED (или выше) гарантирует защиту.
    connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
  • Почему это критично: Dirty Write нарушает атомарность транзакций и делает данные непредсказуемыми.