แก้ไขหลังจากอ่านลิงก์ฟอรัม MSDN จากความคิดเห็นน่าสนใจมาก
ผู้ใช้สองคนไม่สามารถอัปเดตหน้าเดียวพร้อมกันโดยไม่คำนึงถึงระดับการแยกผู้ใช้ไม่สามารถอ่านเพจที่อัปเดตบางส่วนได้ แค่คิดว่า SQL Server จะจัดการกับหน้าเว็บที่ส่วนหัวบอกว่า 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 จะผิดรูปแบบ