Как ответить
Грязное чтение (dirty read) — это ситуация, когда одна транзакция читает данные, изменённые другой транзакцией, но ещё не зафиксированные. Эта проблема отсутствует на уровне изоляции READ COMMITTED и выше (REPEATABLE READ, SERIALIZABLE). На уровне READ UNCOMMITTED грязное чтение возможно.
Как работает READ COMMITTED: Транзакция видит только те изменения, которые уже были зафиксированы (COMMIT) другими транзакциями к моменту выполнения каждого её оператора чтения. Это гарантирует, что читаемые данные не будут откачены, и исключает грязное чтение. Однако на этом уровне возможны неповторяемое чтение и фантомные строки — но сам вопрос про грязное чтение уже решён.
Пример: Транзакция A выполняет UPDATE счётчика, но не делает COMMIT. Транзакция B на уровне READ UNCOMMITTED увидит новое значение (грязное чтение). На READ COMMITTED — нет, B прочитает старое значение до фиксации A.
На практике большинство СУБД (PostgreSQL, Oracle, SQL Server) по умолчанию используют READ COMMITTED. MySQL InnoDB — REPEATABLE READ, что также исключает грязное чтение. Разница между ними не в грязном чтении, а в других аномалиях.
Важно: Стандарт SQL определяет четыре уровня, но реализации могут добавлять собственные механизмы (например, snapshot isolation в PostgreSQL). Главное — READ COMMITTED — это минимальный уровень, на котором грязное чтение гарантированно отсутствует.