Yorumdan MSDN forum bağlantısını okuduktan sonra DÜZENLENMİŞ , çok ilginç.
Yalıtım düzeyinden bağımsız olarak, iki kullanıcı tek bir sayfayı aynı anda güncelleyemez ve hiçbir kullanıcı kısmen güncellenmiş bir sayfayı okuyamaz. SQL Server'ın Col3'ün bayt 17'de başladığını söyleyen bir sayfayla nasıl başa çıkacağını düşünün. Ancak satırın bu kısmı henüz güncellenmediğinden gerçekten byte 25'te başlar. Bir veritabanının bunu halletmesinin bir yolu yoktur.
Ancak 8k'den büyük satırlar için birden çok sayfa kullanılır ve bu, yarı güncellenmiş bir sütunu mümkün kılar. MSDN bağlantısından kopyalandı (bağlantının kopması durumunda), bu sorguyu bir pencerede başlatın:
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
Bu bir tablo oluşturur ve sonra 100.000x aynı karakter dizesiyle günceller. İlk sorgu çalışırken, bu sorguyu başka bir pencerede başlatın:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
İkinci sorgu yarı güncellenmiş bir sütun okuduğunda durur. Yani, ilk karakter sonuncudan farklı olduğunda. Hızlı güncellenerek, yarı güncellenmiş sütunları okumanın mümkün olduğunu kanıtlar. nolockİpucunu kaldırırsanız, ikinci sorgu hiçbir zaman tamamlanmaz.
Şaşırtıcı sonuç! Yarı güncellenmiş bir XML sütunu bir (nolock)raporu bozabilir , çünkü XML hatalı biçimlendirilir.