Ответ
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 нарушает атомарность транзакций и делает данные непредсказуемыми.