EDITADO depois de ler o link do fórum do MSDN no comentário , muito interessante.
Independentemente do nível de isolamento, dois usuários não podem atualizar uma única página simultaneamente, nem podem ler uma página parcialmente atualizada. Imagine como o SQL Server lidaria com uma página em que o cabeçalho diz Col3 começa no byte 17. Mas ele realmente começa no byte 25, porque essa parte da linha ainda não foi atualizada. Não há como um banco de dados lidar com isso.
Porém, para linhas maiores que 8k, várias páginas são usadas e isso possibilita uma coluna semi-atualizada. Copiado do link do MSDN (caso o link seja interrompido), inicie esta consulta em uma janela:
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
Isso cria uma tabela e a atualiza com uma sequência de 100.000x o mesmo caractere. Enquanto a primeira consulta estiver em execução, inicie-a em outra janela:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
A segunda consulta para quando lê uma coluna que está parcialmente atualizada. Ou seja, quando o primeiro caractere é diferente do último. Ele terminará rapidamente, provando que é possível ler colunas semi-atualizadas. Se você remover a nolock
dica, a segunda consulta nunca será concluída.
Resultado surpreendente! Uma coluna XML semi-atualizada pode quebrar um (nolock)
relatório, porque o XML estaria malformado.