Dirty Read (грязное чтение) — это проблема при работе с базами данных в многопользовательской среде, когда одна транзакция читает данные, которые были изменены (но еще не зафиксированы) другой транзакцией. Если транзакция, изменившая данные, в итоге откатится (rollback), то данные, прочитанные первой транзакцией, окажутся неверными или "грязными".
Особенности:
READ UNCOMMITTED. Этот уровень позволяет читать незафиксированные данные.READ COMMITTED или выше. При этих уровнях транзакция может читать только зафиксированные данные.Пример:
| Время | Транзакция A | Транзакция B |
|---|---|---|
| T1 | Начать транзакцию A | |
| T2 | Начать транзакцию B | |
| T3 | UPDATE balance SET amount = amount - 100 WHERE account_id = 1; (не зафиксировано) | |
| T4 | SELECT amount FROM balance WHERE account_id = 1; (Dirty Read) | |
| T5 | ROLLBACK; | |
| T6 | Обработка данных из T4 (с неверным значением) |
В данном примере Транзакция A прочитала измененное, но не зафиксированное значение баланса, которое затем было отменено Транзакцией B. Транзакция A продолжает работу с неверными данными.