2010-03-31 3 views
1

Je me suis retrouvé dans une situation d'interblocage où j'ai du mal à trouver la cause ... Le graphique Deadlock suggère qu'une instruction UPDATE est devenue la victime sur une instruction SELECT ... que l'instruction uPDATE tente d'acquérir un index sur une autre table qui est jamais mentionné dans la déclaration de mise à jour ...Problème de verrou de SQL Server 2008

Voici comment mon instruction uPDATE ressemble ...

UPDATE Table set col1 = @P1 where col2 = @P2 

Cette déclaration a acquis une X verrouille l'index col2, mais tente également d'acquérir un index sur une colonne définie dans une autre table qui n'est aucunement liée à l'U Instruction PDATE ...

Et l'instruction SELECT qui a remporté la situation de blocage n'a rien à voir avec la table ou l'index dans l'instruction update mais a essayé d'acquérir un index sur la table dans l'instruction UPDATE. causant finalement le DEADLOCK.

+2

Vous voudrez peut-être vérifier vos contraintes et dépendances. Peut-être que la table verrouillée par UPDATE a une contrainte ou un déclencheur ou quelque chose qui le modifie lorsque votre table UPDATE est modifiée. – tloflin

Répondre

4

La transaction mise à jour/lock comprendra des choses comme:

  • déclenche
  • validation de clé étrangère (? Est col1 un fk)
  • contraintes de contrôle (sur col1 en utilisant udf)
  • vues indexées (qui utilise table.col1 ou table.col2)

L'un de ceux-ci pourrait provoquer un verrouillage de la table apparemment non liée

0

En plus des autres excellentes réponses, quelque chose à considérer est un select qui acquiert généralement un verrou de lecture partagé, ce qui permet à une série de sélections de maintenir un verrou partagé sur la ressource. L'instruction update peut ne jamais avoir l'opportunité d'obtenir un verrou exclusif. Normalement, le moteur fait un bon travail pour empêcher ce type de famine, mais si vous utilisez la mise à jour dans une transaction avec une autre déclaration (s), cela peut compliquer le problème. Si c'est le cas, donnez plus de détails sur ce qui se passe dans la transaction.

+1

La première phrase desribes un "livelock" http://www.thesqlteam.com/dasblogce/PermaLink,guid,504b355e-e3af-44b8-84d7-5d230c232d31.aspx ou http://blog.sqlauthority.com/2008/03/21/sql-server-introduction-à-live-lock-quoi-est-live-lock/ – gbn

+0

+1 Nice link. Il existe des situations où ces mécanismes de détection échoueront et vous devrez ajouter des indices de verrouillage. Comme une transaction qui inclut une sélection puis une mise à jour (verrou partagé essayant d'être ugpradé à exclusif), de sorte que vous devez ajouter un indicateur de requête pour que l'instruction select obtienne un verrou exclusif dès le départ. – AaronLS