web-dev-qa-db-fra.com

Image de la mise à jour de l'index SQL Server

J'ai 2 questions qui, lorsqu'elles courent en même temps causent une impasse.

Query 1 - Mettez à jour une colonne incluse dans un index (Index1):

update table1 set column1 = value1 where id = @Id

Prend X-Verrouillage sur la table1 puis tente une verroue X sur Index1.

Query 2:

select columnx, columny, etc from table1 where {some condition}

Prend une serrure S sur Index1 puis tente une serrure S sur table1.

Y a-t-il un moyen d'empêcher l'impasse tout en maintenant les mêmes requêtes? Par exemple, puis-je en quelque sorte prendre une verroue X à l'indice dans la transaction de mise à jour avant la mise à jour pour assurer que le tableau et l'index d'accès sont dans le même ordre - ce qui devrait empêcher l'impasse?

Le niveau d'isolement est lu engagé. Les verrous de ligne et de page sont activés pour les index. Il est possible que le même enregistrement participe aux deux requêtes - je ne peux pas dire au graphique de l'impasse, car il ne montre pas les paramètres.

graphique deadlock

13
Dale K

J'ai un problème similaire qui se produit occasionnellement et voici l'approche que je prends.

  1. Ajouter set deadlock priority low; à la sélection. Cela fera que cette requête soit la victime de l'impasse lorsqu'une impasse se produit.
  2. Configurez la logique de réessayer dans votre application pour réessayer automatiquement la sélection si elle échoue en raison de l'impasse (ou du délai d'attente), après avoir attendu/dormir pendant une brève période de temps pour permettre aux requêtes de blocage.

Remarque: si votre select fait partie d'une transaction multi-instruction explicite, vous devez vous assurer de réessayer toute la transaction et non seulement de l'instruction qui a échoué, sinon vous pouvez obtenir des résultats inattendus. Si ceci est un seul select alors vous allez bien, mais s'il s'agit de l'instruction x de n dans une transaction, assurez-vous simplement de réessayer tout n déclarations pendant la nouvelle tentative.

1
BateTech