Comment SQL Server détermine-t-il l'ordre dans lequel il prend les verrous lors de la sélection d'une table?

10

J'ai deux procédures stockées qui sont bloquées lorsque le système est sous charge. Proc A sélectionne dans une table tandis que Proc B est inséré dans la même table. Le graphique de verrouillage montre que Proc A a un verrou de page en mode S pour lequel Proc B veut un verrou de mode IX, Proc A attend cependant un verrouillage de page en mode S pour une page différente pour laquelle Proc B a déjà un verrou de page en mode IX. .

De toute évidence, cela pourrait être réglé en veillant à ce que les deux requêtes verrouillent les pages du tableau dans le même ordre, mais je ne peux pas comprendre comment le faire.

Ma question est la suivante: comment SQL Server détermine-t-il l'ordre de verrouillage des pages lors des insertions et des sélections et comment pouvez-vous modifier ce comportement?

Martin Brown
la source

Réponses:

2

Comment SQL Server détermine-t-il l'ordre de verrouillage des pages lors de l'insertion et de la sélection d'un

Indéterminé - effectué par le traitement interne et en fonction de la sortie de l'optimiseur de requête.

et comment pouvez-vous modifier ce comportement?

Contrôlez votre isolement. Si vous lisez pour écrire, dites à SQL Server d'obtenir immédiatement un verrou en écriture. Point fermé.

TomTom
la source
1

Actuellement, proc A a un verrou partagé.

"Aucune autre transaction ne peut modifier les données tant qu'il existe des verrous partagés (S) sur la ressource." http://msdn.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx

Si vous utilisez SQL 2005 ou une version ultérieure, essayez d'utiliser l'isolement de capture instantanée.

"Le niveau d'isolement d'instantané utilise le versionnement des lignes pour fournir une cohérence de lecture au niveau de la transaction. Les opérations de lecture n'acquièrent aucun verrou de page ou de ligne; seuls les verrous de table SCH-S sont acquis. Lors de la lecture des lignes modifiées par une autre transaction, ils récupèrent la version de la ligne qui existait au début de la transaction. Vous ne pouvez utiliser l'isolement d'instantané par rapport à une base de données que lorsque l'option de base de données ALLOW_SNAPSHOT_ISOLATION est activée. Par défaut, cette option est désactivée pour les bases de données utilisateur. " http://msdn.microsoft.com/en-us/library/ms189122.aspx

Étant donné que seuls les verrous Sch-S sont acquis, votre lecture ne devrait pas pouvoir bloquer votre écriture.

"Les verrous de stabilité de schéma (Sch-S) ne bloquent aucun verrou transactionnel, y compris les verrous exclusifs (X)." http://msdn.microsoft.com/en-us/library/ms189122.aspx

Gardez à l'esprit que Snapshot Isolation Level fait un usage intensif de tempdb pour le versionnage des lignes, alors dimensionnez-le correctement et respectez les meilleures pratiques pour les stratégies de disque tempdb.

Brian
la source