web-dev-qa-db-fra.com

SQL Server READ COMMITTED SNAPSHOT vs SNAPSHOT

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.

  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?

23
John Russell
  1. 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é.
  2. Lorsqu'une 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 COMMITTEDSNAPSHOTT1 attendrait T2 pour libérer le verrou X sur la ligne et continuer normalement.
18
usr

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

0