2012-03-15 1 views
-1

я начать с простого вопроса:Как Читайте Committed уровень изоляции предотвращает грязное чтение

по определению Грязный Распознать Wikipedia и Msdn:

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

Происходит грязное чтение, когда T1 обновляет строку, а T2 читает строку, которая «еще не завершена», T1

, но при чтении совершенного уровня sh Заблокированные блоки блокируются, как только данные считываются (не в конце транзакции или даже в конце заявления

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

ответ

1

Это предотвращает загрязнение чтения, поскольку T1 имеет блокировка строки, поэтому T2 не может прочитать строку «еще не совершена», которую позже можно отбросить.

Проблема Read Committed пытается решить это:

T1 создает транзакцию и пишет что-то

T2 читает что-то

T1 откатить транзакцию

Теперь T2 имеет данные, на самом деле никогда не существовало.

В зависимости от того, как DB структурирована, есть два «хорошие» возможности:

T1 создает транзакцию и записывает что-то

T2 ждет, пока T1 для завершения транзакции

или

T2 читает «моментальный снимок» того, как БД была ПЕРЕД Т1, начала транзакцию (она называется «Чтение, проведенное с использованием управления версиями строк»)

(по умолчанию на MSSQL является первым вариантом)

Вот, например, есть сравнение различных уровней изоляции: http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx (читать под Isolation Levels Предлагаемые в SQL Server 2005)

+0

говорят у «T1 имеет блокировку на строку, поэтому T2 не может прочитать„еще не совершил“строку, которая может быть rollbacked позже», но если T1 имеет эту блокировку на строку, пока конец транзакции, почему мы должны иметь возможность повторного чтения изоляции для всей транзакции, могу ли я понять? –

+0

@raoofhojat Повторяемый - это еще один уровень изоляции. Это означает, что T2 читает, T1 записывает и фиксирует, T2 перечитывает, если он повторяется, он должен перечитывать те же значения в первый раз. Это можно получить двумя способами: T1 берет блокировку во время первого чтения, поэтому T2 не может писать посередине и должен ждать завершения транзакции T1 или использовать полную моментальную съемку (это больше, чем управление версиями строк, если вы смотрите за столом) – xanatos

+0

i know Repeatable - это еще один уровень изоляции, u сказал: «T2 не может прочитать« еще не зафиксированную »строку, которую можно отбросить позже», если ее то, что выполняется Commited Reads, затем Commited Reads может блокировать читать до конца транзакции, тогда он может обрабатывать повторяющиеся чтения –

0

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

Ripped от here

+0

chris, даже если короткоживущая доля блокировок длится так долго, она не может убедиться, что T1 не может отменить транзакцию, эта блокировка будет освобождена, а T2 сможет прочитать обновленную строку, которая будет позже возвращена –

+0

@raoofhojat - false. Краткосрочные блокировки акций предназначены для чтения. Обновления всегда приобретают эксклюзивную блокировку, которая не освобождается до совершения транзакции. –

+0

-but мы не обновляем блокировки в прочитанном уровне, чтобы гарантировать, что строка, которая является edditing по T1, не считывается T2 после (посмотрите на мой senario), тогда как прочитанная порученная гарантия не грязная читает –

Смежные вопросы