La plupart des forums et des exemples en ligne suggèrent toujours de les avoir tous les deux ALLOW_SNAPSHOT_ISOLATION
et READ_COMMITTED_SNAPSHOT
sont activés lorsque quelqu'un pose un instantané, une version de ligne ou une question similaire.
Je suppose que le mot SNAPSHOT dans les deux contextes est un peu déroutant. J'ai pensé que, pour que le moteur de base de données utilise la gestion des versions de ligne au lieu de verrous pour le comportement par défaut de READ_COMMITTED, la base de données READ_COMMITTED_SNAPSHOT
est définie sur ON, quel que soit le ALLOW_SNAPSHOT_ISOLATION
paramètre défini.
Le ALLOW_SNAPSHOT_ISOLATION
réglage est réglé sur ON uniquement pour permettre l' isolement d'instantané lors du démarrage d' une transaction (par exemple SET TRANSACTION SNAPSHOT ISOLEMENT DE NIVEAU) quel que soit de READ_COMMITTED_SNAPSHOT
réglage.
La seule raison pour laquelle ces deux paramètres sont définis sur ON est lorsqu'il est nécessaire de disposer de la version de ligne READ COMMITTED et de l' isolation de capture instantanée.
Ma question est la suivante: ma compréhension est-elle incorrecte d'une manière ou d'une autre? Et que ces deux paramètres doivent toujours être sur ON (en particulier pour la gestion des versions de lignes READ COMMITTED)?
OK, rentra chez moi et testé. Voici l'observation.
Premier test avec confirmation des deux paramètres sur OFF.
Requête 1
Requête 2
Dans ce test, la requête 2 attend que la requête 1 soit validée, dm_tran_locks DMV montre ce verrouillage exclusif sur TABLE1 engagé par la requête 1.
Deuxième test , annuler la transaction précédente, définissez READ_COMMITTED_SNAPSHOT sur ON, mais laissez ALLOW_SNAPSHOT_ISOLATION sur OFF.
Exécuter la requête 1, puis la requête 2. DMV indique que la requête 1 est soumise à un verrou exclusif, mais que la requête 2 renvoie les détails avec "Original" sans que la requête 1 valide la transaction. Il semble que la gestion des versions de ligne READ_COMMITTED est en place.
L'ajout
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
aux requêtes 1 et 2 et l'exécution de la requête 1 ou de la requête 2 renvoie une erreur. La transaction d'isolation de capture instantanée n'a pas pu accéder à la base de données 'TEST' car l'isolation de capture instantanée n'est pas autorisée dans cette base de données. Utilisez ALTER DATABASE pour autoriser l'isolation de cliché.Troisième test , annuler la transaction précédente. Définissez READ_COMMITTED_SNAPSHOT OFF et ALLOW_SNAPSHOT_ISOLATION ON.
Exécutez la requête 1, puis la requête 2. DMV indique le verrou exclusif généré par la requête 1. La requête 2 semble attendre que la requête 1 soit terminée. L'activation de ALLOW_SNAPSHOT_ISOLATION ne semble pas activer le contrôle de version des lignes READ COMMITTED.
Ajout
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
à la fois à la requête 1 et à la requête 2. Exécutez la requête 1, puis la requête 2. Tandis que DMV indique que la requête 1 a un verrou exclusif, la requête 2 renvoie les détails avec le mot 'Original'. L'isolation de l'instantané semble être en place.L'observation du test montre qu'elle
READ_COMMITTED_SNAPSHOT
active / désactive elle - même le contrôle de version des lignes READ COMMITTED, quel que soit leALLOW_SNAPSHOT_ISOLATION
paramètre défini, et inversement.la source
Votre compréhension est correcte. J'aime la définition courte, propre et simple d' ici :
Il semble que beaucoup de malentendus viennent de la SEP elle-même. Par exemple, ici ils disent:
Mais "l'isolement instantané" mentionné n'est pas égal au comportement de transaction pour lequel
set transaction isolation level snapshot
est appliqué.En ce qui concerne la différence, une bonne explication est ici .
Il serait probablement préférable que READ_COMMITTED_SNAPSHOT porte le nom READ_COMMITTED_ROW_VERSIONING ou quelque chose du genre. :)
la source
J'aime ce résumé de Microsoft :
la source