Как 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), вы, как правило, видите не более одной строки за раз. Единственная цель этих блокировок - убедиться, что оператор только читает и возвращает зафиксированные данные. Блокировки работают, потому что обновления всегда получают эксклюзивную блокировку, которая блокирует любые читатели, пытающиеся получить блокировку общего ресурса.

Разорвал отсюда

Другие вопросы по тегам