Как Read Committed Isolation Level предотвращает грязное чтение - PullRequest
0 голосов
/ 15 марта 2012

я начинаю с простого вопроса:

в соответствии с определением Dirty Read в Wikipedia и Msdn :

у нас есть 2 одновременных транзакции,T1 и T2

Грязные чтения Происходит, когда T1 обновляет строку, а T2 читает строку, которая "еще не зафиксирована" T1

, но на уровне Read Committed Level общие блокировки снимаются каккак только данные будут прочитаны (а не в конце транзакции или даже в конце оператора

, то как Read Committed предотвращает грязное чтение? Bkaz, как только блокировка общего доступа, выпущенная в обновленной строке T2, может прочитатьобновленная строка и t1 может откатить всю операцию, тогда мы имеем грязное чтение на руке t1

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Это предотвращает грязное чтение, поскольку 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)»

0 голосов
/ 15 марта 2012

Когда SQL Server выполняет инструкцию на уровне изоляции фиксации чтения, он получает блокировку кратковременных общих ресурсов по строкам. Продолжительность этих блокировок общего ресурса достаточно велика для чтения и обработки каждой строки; сервер обычно снимает каждую блокировку, прежде чем перейти к следующей строке. Таким образом, если вы выполняете простой оператор выбора в разделе «Подтверждение чтения» и проверяете наличие блокировок (например, с помощью sys.dm_tran_locks), вы, как правило, видите не более одной блокировки строки за раз. Единственная цель этих блокировок - убедиться, что оператор только читает и возвращает зафиксированные данные. Блокировки работают, потому что обновления всегда получают эксклюзивную блокировку, которая блокирует любые читатели, пытающиеся получить блокировку общего ресурса .

Разорвано с здесь

...