संपादित पढ़ने के बाद टिप्पणी से MSDN मंच लिंक , बहुत ही दिलचस्प।
अलगाव स्तर के बावजूद, दो उपयोगकर्ता एक साथ एक पृष्ठ को अपडेट नहीं कर सकते हैं, और न ही कोई उपयोगकर्ता आंशिक रूप से अपडेट किए गए पृष्ठ को पढ़ सकता है। जरा सोचिए कि SQL सर्वर उस पेज से कैसे निपटेगा जहां हेडर कहता है कि Col3 बाइट 17 से शुरू होता है। लेकिन यह वास्तव में बाइट 25 से शुरू होता है, क्योंकि पंक्ति का वह हिस्सा अभी तक अपडेट नहीं किया गया है। कोई तरीका नहीं है कि एक डेटाबेस को संभाल सकता है।
लेकिन 8k से बड़ी पंक्तियों के लिए, कई पृष्ठों का उपयोग किया जाता है, और यह आधे-अपडेट किए गए कॉलम को संभव बनाता है। MSDN लिंक से लिंक किया गया (लिंक टूटने की स्थिति में), इस क्वेरी को एक विंडो में शुरू करें:
if object_id('TestTable') is not null
drop table TestTable
create table TestTable (txt nvarchar(max) not null)
go
insert into TestTable select replicate(convert(varchar(max),
char(65+abs(checksum(newid()))%26)),100000)
go 10
update TestTable set txt=replicate(convert(varchar(max),
char(65+abs(checksum(newid()))%26)),100000)
go 100000
यह एक तालिका बनाता है और फिर इसे उसी वर्ण के 100.000x स्ट्रिंग के साथ अद्यतन करता है। जबकि पहली क्वेरी चल रही है, इस क्वेरी को किसी अन्य विंडो में प्रारंभ करें:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
दूसरी क्वेरी तब बंद हो जाती है जब वह एक कॉलम पढ़ता है जो आधा अपडेट होता है। अर्थात्, जब पहला वर्ण पिछले से अलग होता है। यह जल्दी से खत्म हो जाएगा, यह साबित करते हुए कि आधे अपडेट किए गए कॉलम को पढ़ना संभव है। यदि आप nolock
संकेत निकालते हैं, तो दूसरी क्वेरी कभी समाप्त नहीं होगी।
आश्चर्यजनक परिणाम! एक अर्ध-अद्यतन XML स्तंभ एक (nolock)
रिपोर्ट तोड़ सकता है , क्योंकि XML विकृत हो जाएगा।