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é.
NOLOCK
Je suis sûr qu'il serait possible de concevoir une situation où les colonnes NCI provenaient d'une version de la ligne mais le CI d'une version différente. De plus, les données hors ligne et les pages lob ne seraient pas protégées par le verrou de la page de données.nolock
ne pas trouver sa ligne d'origine. Cependant, une seule lecture d'un champ ou d'une ligne doit être cohérente.