INSTANTANÉ LECTURE COMMISE DE SQL Server vs INSTANTANÉ

23

Je recherchais les différences entre SQL Server READ COMMITTED SNAPSHOTet les SNAPSHOTniveaux d'isolement 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 contrôle de version 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 du contrôle de version de ligne.

Je suis un peu nouveau sur ces sujets, mais je n'arrive pas à comprendre les deux points du lien ci-dessus.

  1. Pourquoi l'espace tempdb serait-il différent pour ces modes? L'un stocke-t-il des versions plus granulaires que l'autre?

  2. Pourquoi l'isolement de cliché est-il plus vulnérable aux conflits de mise à jour?

John Russell
la source

Réponses:

18
  1. READ COMMITTED SNAPSHOTutilise 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 que dans le cas de SNAPSHOTtransactions 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é.
  2. Lorsqu'une SNAPSHOTtransaction T1écrit sur une ligne qui a été modifiée par une autre transaction T2entre le T1démarrage et la T1tentative d'é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 T1attendrait pour T2libérer le verrou X sur la ligne et continuer normalement.
usr
la source
1
Pour # 2, est-il sûr de dire que SNAPSHOT ne se verrouille pas exclusivement pour les mises à jour - il repose uniquement sur la version des lignes?
John Russell
1
@JohnRussell, il se verrouille exclusivement pour prendre en charge la restauration. Toutes les écritures doivent verrouiller en X pour garantir la restauration de la ligne en cas de restauration.
usr
0

Une autre différence entre l'instantané et l'instantané validé en lecture est la suivante.

  1. Instantané

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 le 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.

Artashes Khachatryan
la source