Answers:
EDITED看完后从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格式不正确。
NOLOCK
我的肯定下,可以设计一种情况,其中NCI列来自该行的一个版本,而CI来自不同版本。另外,行外数据和lob页将不受数据页上的锁存器的保护。
nolock
但找不到原始行。但是,一次读取字段或行应该保持一致。