수정 됨 판독 후 주석에서 MSDN 포럼 링크를 매우 흥미로운.
격리 수준에 관계없이 두 명의 사용자가 단일 페이지를 동시에 업데이트 하거나 일부 사용자가 부분적으로 업데이트 된 페이지를 읽을 수 없습니다. Col3이 17 바이트에서 시작한다고 헤더가 표시된 페이지를 SQL Server가 처리하는 방법을 상상해보십시오. 그러나 행의 일부가 아직 업데이트되지 않았기 때문에 실제로는 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
힌트 를 제거하면 두 번째 쿼리가 완료되지 않습니다.
놀라운 결과! (nolock)
XML이 잘못되어 반 업데이트 된 XML 열이 보고서를 손상 시킬 수 있습니다.