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