Je recherchais les différences entre les niveaux d'isolation READ COMMITTED SNAPSHOT
Et SNAPSHOT
de SQL Server et suis tombé sur la ressource suivante:
Choix des niveaux d'isolement basés sur le contrôle de version des lignes
Pour la plupart des applications, il est recommandé de lire l'isolement validé à l'aide du contrôle de version de ligne par rapport à l'isolement de capture instantanée pour les raisons suivantes:
Il consomme moins d'espace tempdb que l'isolement de cliché.
L'isolement de capture instantanée est vulnérable aux conflits de mise à jour qui ne s'appliquent pas à la lecture de l'isolement validé à l'aide du versionnage de ligne. Lorsqu'une transaction s'exécutant sous l'isolement d'instantané lit des données qui sont ensuite modifiées par une autre transaction, une mise à jour par la transaction d'instantané vers les mêmes données provoque un conflit de mise à jour et la transaction se termine et annule. Ce n'est pas un problème avec l'isolation validée en lecture à l'aide de la gestion des versions de ligne.
Je suis un peu nouveau sur ces sujets, mais je n'arrive pas à comprendre les deux points du lien ci-dessus.
Pourquoi l'espace tempdb serait-il différent pour ces modes? L'un stocke-t-il des versions plus granulaires que l'autre?
Pourquoi l'isolement de cliché est-il plus vulnérable aux conflits de mise à jour?
READ COMMITTED SNAPSHOT
utilise un nouvel instantané après chaque instruction. Cela signifie que moins de versions de lignes sont maintenues en vie. (L'instruction que vous avez citée dans les documents est légèrement trompeuse car elle suggère que cela est toujours vrai - ce n'est vrai qu'en cas de transactions SNAPSHOT
de longue durée.) Les versions de ligne de capture instantanée sont créées lors des écritures. Les lectures n'influencent pas ce qui est mis dans tempdb. Les écrivains ne peuvent pas prévoir quelles lectures seront effectuées à l'avenir. Les lecteurs n'influencent que ce qui peut être purgé.SNAPSHOT
transaction T1
écrit sur une ligne qui a été modifiée par une autre transaction T2
entre T1
commencé et T1
a tenté l'écriture, l'instruction échoue avec une erreur de conflit de mise à jour. Il s'agit d'un modèle de concurrence optimiste. Avec READ COMMITTED
SNAPSHOT
T1
attendrait T2
pour libérer le verrou X sur la ligne et continuer normalement.Une autre différence entre l'instantané et l'instantané validé en lecture est la suivante.
Lors de la première session
SET TRAN ISOLATION LEVEL INSTANTANÉ DE COMMENCER TRAN SELECT * DE TB1 ..... .....
Dans la deuxième session
Mettre à jour TB1 SET NAME = NAME + 'test' Où id = 1
Lors de la première session
SELECT * FROM TB1 - CECI renverra le nom de la valeur pour ID = 1, pas nom + 'test' COMMIT TRAN
Dans l'instantané de lecture validée, la première sélection de la session 1 renverra le nom pour id = 1, et la seconde sélection renverra le nom + 'test'.
Ainsi, dans l'isolement d'instantané, SQL SERVER effectue un instantané au début de la transaction et lit à partir de cet instantané pendant toute la transaction.
Dans l'instantané validé en lecture, l'instantané est pris pour chaque instruction SELECT pendant la transaction.