MODIFICATO dopo aver letto il link al forum MSDN dal commento , molto interessante.
Indipendentemente dal livello di isolamento, due utenti non possono aggiornare contemporaneamente una singola pagina , né nessun utente può leggere una pagina parzialmente aggiornata. Immagina come SQL Server gestirà una pagina in cui l'intestazione dice che Col3 inizia al byte 17. Ma inizia davvero al byte 25, perché quella parte della riga non è stata ancora aggiornata. Non è possibile che un database possa gestirlo.
Ma per le righe più grandi di 8k, vengono utilizzate più pagine e ciò rende possibile una colonna semi-aggiornata. Copiato dal collegamento MSDN (in caso di interruzione del collegamento), avvia questa query in una finestra:
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
Questo crea una tabella e quindi la aggiorna con una stringa di 100.000 volte lo stesso carattere. Mentre la prima query è in esecuzione, avvia questa query in un'altra finestra:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
La seconda query si interrompe quando legge una colonna che è semi-aggiornata. Cioè, quando il primo personaggio è diverso dall'ultimo. Finirà rapidamente, dimostrando che è possibile leggere colonne semi-aggiornate. Se rimuovi il nolock
suggerimento, la seconda query non finirà mai.
Risultato sorprendente! Una colonna XML semi-aggiornata potrebbe interrompere un (nolock)
report, poiché l'XML sarebbe errato.