Diedit setelah membaca tautan forum MSDN dari komentar , sangat menarik.
Terlepas dari tingkat isolasi, dua pengguna tidak dapat memperbarui satu halaman secara bersamaan, juga tidak ada pengguna yang dapat membaca halaman yang diperbarui sebagian. Bayangkan saja bagaimana SQL Server akan berurusan dengan halaman di mana header mengatakan Col3 dimulai pada byte 17. Tapi itu benar-benar dimulai pada byte 25, karena bagian dari baris itu belum diperbarui. Tidak mungkin database bisa mengatasinya.
Tetapi untuk baris yang lebih besar dari 8k, banyak halaman digunakan, dan itu memungkinkan kolom yang setengah diperbarui. Disalin dari tautan MSDN (jika tautan rusak), mulailah kueri ini dalam satu jendela:
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
Ini membuat tabel dan kemudian memperbaruinya dengan string 100.000x karakter yang sama. Saat kueri pertama berjalan, mulai kueri ini di jendela lain:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
Kueri kedua berhenti ketika membaca kolom yang setengah diperbarui. Yaitu, ketika karakter pertama berbeda dari yang terakhir. Ini akan selesai dengan cepat, membuktikan bahwa mungkin untuk membaca kolom yang setengah diperbarui. Jika Anda menghapus nolock
petunjuk, permintaan kedua tidak akan pernah selesai.
Hasil yang mengejutkan! Kolom XML yang setengah diperbarui mungkin memecah (nolock)
laporan, karena XML akan salah format.