EDYTOWANE po przeczytaniu linku do forum MSDN z komentarza , bardzo interesujące.
Niezależnie od poziomu izolacji, dwóch użytkowników nie może zaktualizować jednej strony jednocześnie, ani też żaden użytkownik nie może odczytać częściowo zaktualizowanej strony. Wyobraź sobie, jak SQL Server poradziłby sobie ze stroną, na której nagłówek mówi, że Col3 zaczyna się od bajtu 17. Ale tak naprawdę zaczyna się od bajtu 25, ponieważ ta część wiersza nie została jeszcze zaktualizowana. Baza danych nie może sobie z tym poradzić.
Jednak w przypadku wierszy większych niż 8 tys. Używanych jest wiele stron, dzięki czemu możliwa jest aktualizacja kolumny w połowie. Skopiowane z łącza MSDN (w przypadku zerwania łącza), rozpocznij zapytanie w jednym oknie:
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
Spowoduje to utworzenie tabeli, a następnie zaktualizuje ją ciągiem 100 000x tego samego znaku. Podczas działania pierwszego zapytania uruchom je w innym oknie:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
Drugie zapytanie kończy się, gdy czyta kolumnę, która jest w połowie zaktualizowana. To znaczy, gdy pierwsza postać różni się od ostatniej. Skończy się szybko, udowadniając, że można odczytać kolumny częściowo zaktualizowane. Jeśli usuniesz nolock
podpowiedź, drugie zapytanie nigdy się nie zakończy.
Zaskakujący wynik! W połowie zaktualizowana kolumna XML może uszkodzić (nolock)
raport, ponieważ kod XML byłby zniekształcony.