BEARBEITET nach dem Lesen des MSDN-Forum-Links aus dem Kommentar , sehr interessant.
Unabhängig von der Isolationsstufe können zwei Benutzer weder eine einzelne Seite gleichzeitig aktualisieren, noch kann ein Benutzer eine teilweise aktualisierte Seite lesen. Stellen Sie sich vor, wie SQL Server mit einer Seite umgehen würde, auf der laut Header Col3 bei Byte 17 beginnt. Aber es beginnt wirklich bei Byte 25, da dieser Teil der Zeile noch nicht aktualisiert wurde. Eine Datenbank kann damit auf keinen Fall umgehen.
Bei Zeilen, die größer als 8 KB sind, werden jedoch mehrere Seiten verwendet. Dies ermöglicht eine halb aktualisierte Spalte. Starten Sie diese Abfrage in einem Fenster, das vom MSDN-Link kopiert wurde (falls der Link unterbrochen wird):
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
Dadurch wird eine Tabelle erstellt und anschließend mit einer Zeichenfolge von 100.000x demselben Zeichen aktualisiert. Starten Sie diese Abfrage, während die erste Abfrage ausgeführt wird, in einem anderen Fenster:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
Die zweite Abfrage wird beendet, wenn eine zur Hälfte aktualisierte Spalte gelesen wird. Das heißt, wenn sich das erste Zeichen vom letzten unterscheidet. Es wird schnell beendet und beweist, dass es möglich ist, halb aktualisierte Spalten zu lesen. Wenn Sie den nolock
Hinweis entfernen , wird die zweite Abfrage niemals beendet.
Überraschendes Ergebnis! Eine halb aktualisierte XML-Spalte kann einen (nolock)
Bericht beschädigen, da das XML fehlerhaft ist.