Предположим, у нас есть 2 транзакции, такие как T1, T2, где T2 выполняет грязное чтение данных, измененных T1, и фиксируется до T1. Теперь предположим, что T1 дает сбой и выполняется откат. Мой вопрос: поскольку T2 зафиксирован, изменения, сделанные T2, переносятся из общего буфера в исходную базу данных или нет (поскольку я читал, что изменения, сделанные транзакцией, становятся постоянными в исходной базе данных после фиксации транзакции)? И если они будут перенесены в исходную базу данных, то как T1 откатится и получит предыдущее значение элемента данных (которое было грязно прочитано T2)? По своему буферу или исходной базе данных?
Проблема с грязным чтением - обновление в базе данных после транзакции, выполняющей грязное чтение
Ответы (1)
Если вы специально не вызываете грязное чтение, устанавливая уровень изоляции, то такая проблема просто не может возникнуть. В этом вся суть сделки. T2 будет заблокирован из строки, если T1 обновил ее. Если вы разрешаете грязное чтение, устанавливая set transaction isolation level read uncommitted
, тогда обработка данных зависит от вас, обычно с использованием версии строки, которая проверяется вашим T2, не изменилась до ее фиксации.
person
TomC
schedule
13.02.2019