MODIFIÉ après avoir lu le lien du forum MSDN du commentaire , très intéressant.
Quel que soit le niveau d'isolement, deux utilisateurs ne peuvent pas mettre à jour une seule page simultanément, ni aucun utilisateur ne peut lire une page partiellement mise à jour. Imaginez simplement comment SQL Server traiterait une page où l'en-tête indique que Col3 commence à l'octet 17. Mais cela commence vraiment à l'octet 25, car cette partie de la ligne n'a pas encore été mise à jour. Il n'y a aucun moyen qu'une base de données puisse gérer cela.
Mais pour les lignes de plus de 8 Ko, plusieurs pages sont utilisées, ce qui rend possible une colonne à moitié mise à jour. Copié à partir du lien MSDN (en cas de rupture du lien), lancez cette requête dans une fenêtre:
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
Cela crée une table, puis la met à jour avec une chaîne de 100 000x le même caractère. Pendant l'exécution de la première requête, lancez cette requête dans une autre fenêtre:
while 1=1 begin
if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
break
end
La deuxième requête s'arrête lorsqu'elle lit une colonne à moitié mise à jour. Autrement dit, lorsque le premier caractère est différent du dernier. Il se terminera rapidement, prouvant qu'il est possible de lire des colonnes semi-mises à jour. Si vous supprimez l' nolock
indice, la deuxième requête ne se terminera jamais.
Résultat surprenant! Une colonne XML à moitié mise à jour peut casser un (nolock)
rapport, car le XML serait mal formé.