Как Read Committed Isolation Level предотвращает грязное чтение
Я начинаю с простого вопроса:
согласно определению Dirty Read в Википедии и MSDN:
у нас есть 2 одновременных транзакции, T1 и T2
Грязное чтение происходит, когда T1 обновляет строку, а T2 читает строку, которая "еще не зафиксирована" T1
но на уровне Read Committed Level общие блокировки снимаются, как только считываются данные (не в конце транзакции или даже в конце оператора
тогда как Read Committed предотвращает грязное чтение? Bkaz, как только блокировка общего доступа, выпущенная в обновленной строке T2, может прочитать обновленную строку, а t1 может откатить всю операцию, тогда мы имеем грязное чтение на руке t1
2 ответа
Это предотвращает грязное чтение, потому что T1 имеет блокировку строки, поэтому T2 не может прочитать строку "еще не зафиксировано", которую можно откатить позже.
Проблема, которую Read Committed пытается решить:
T1 создает транзакцию и пишет что-то
Т2 читает что-то
T1 откат транзакции
теперь у T2 есть данные, которых на самом деле никогда не было.
В зависимости от того, как устроена БД, есть две "хорошие" возможности:
T1 создает транзакцию и пишет что-то
T2 ждет, пока T1 завершит транзакцию
или же
T2 читает "снимок" того, как была БД, ДО того, как T1 начал транзакцию (он называется "Чтение совершено с использованием контроля версий строк").
(по умолчанию на MSSQL это первый вариант)
Вот, например, сравнение различных уровней изоляции: http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx (см. Раздел "Уровни изоляции, предлагаемые в SQL Server 2005").
Когда SQL Server выполняет оператор на уровне изоляции фиксации чтения, он получает блокировку кратковременных общих ресурсов по строкам. Продолжительность этих блокировок общего ресурса достаточно велика для чтения и обработки каждой строки; сервер обычно снимает каждую блокировку, прежде чем перейти к следующей строке. Таким образом, если вы выполняете простой оператор выбора в разделе "Подтверждение чтения" и проверяете наличие блокировок (например, с помощью sys.dm_tran_locks), вы, как правило, видите не более одной строки за раз. Единственная цель этих блокировок - убедиться, что оператор только читает и возвращает зафиксированные данные. Блокировки работают, потому что обновления всегда получают эксклюзивную блокировку, которая блокирует любые читатели, пытающиеся получить блокировку общего ресурса.
Разорвал отсюда