Verrous partagés pris sous l'isolement de capture instantanée de lecture (RCSI)

9

Je vois des attentes de verrous partagés ( LCK_M_S) lors de l'utilisation de RCSI. Ma compréhension est que cela n'est pas censé se produire car SELECTsne nécessite pas de verrous partagés lors de l'utilisation de RCSI.

Comment puis-je voir les verrous partagés? Est-ce à cause de clés étrangères?

grassbl8d
la source
puis-je également demander, le serveur sql place-t-il des verrous partagés sur les enregistrements s'il n'y a pas d'index même si read_committed_snapshot est activé?
grassbl8d du

Réponses:

13

Comment puis-je voir les verrous partagés? Est-ce à cause de clés étrangères?

Oui. SQL Server revient à l'implémentation de verrouillage du niveau d'isolement validé en lecture lors de l'accès à une table dans le but de valider les contraintes de clé étrangère. Ceci est requis pour l'exactitude et ne peut pas être désactivé.

Le comportement s'applique uniquement aux instructions de modification des données. Les verrous partagés ne sont pris que lors de la vérification des données liées à la clé étrangère. D'autres accès aux données dans le même plan d'exécution peuvent continuer à utiliser la gestion des versions de ligne.

Si SQL Server ne le faisait pas, les instructions de modification des données sous RCSIpourraient finir par violer la contrainte de clé étrangère car le contrôle d'intégrité utilisait des données obsolètes (versionnées).

Malheureusement, il n'existe actuellement aucun moyen pris en charge pour voir ce changement de comportement de verrouillage dans un plan d'exécution. Il est possible de voir les indications de verrouillage interne lorsque l'indicateur de trace 8607 est actif.

Paul White 9
la source