Question

J'ai une impasse amusante causée par une stupide requête SQL UPDATE simple, sur une table plate, sous la valeur par défaut "READ COMMITED". transaction.

UPDATE table SET column=@P1 WHERE PK=@P2
La

colonne PK est varchar (11) et contient un index clusterisé. pas de déclencheur ni de relation de table, etc. sur la table.

J'ai vérifié et constaté que l'impasse se produisait sur "PAGE". niveau, pas au niveau du droit de passage / enregistrement. Ensuite, je constate que pour chaque requête de mise à jour, il faut 100 verrous de page (et plus). (Cela n’a aucun sens pour moi car je mets à jour une ligne à la fois)

Y a-t-il un moyen d'empêcher que des impasses se produisent? Ou comment réduire le nombre de verrous nécessaires pour une mise à jour d'une seule ligne sans utiliser le curseur?

-

Merci pour votre suggestion.

J'ai essayé de reconstruire l'index plusieurs fois, avec des facteurs de remplissage élevés et faibles. J'avais essayé de faire en sorte que les processus mettent à jour différentes positions / tranches. Mais rien n’a été amélioré ni pire.

-

J'ai essayé SQL Server Profiler. J'en ai capturé quelques-uns " Lock: Deadlock Chain " et "Lock: Deadlock", mais pas de " graphe de blocage " a été capturé. Les deux parties effectuent la requête de mise à jour simple en mode de validation automatique à validation validée.

Lock:Deadlock Chain 17887475    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887476    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438102                                                                                                                                                                                                                                                          265006271       0   0X56AF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887477    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887478    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426206                                                                                                                                                                                                                                                           265006240       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887479    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426206                                                                                                                                                                                                                                                          265006271       0   0XDE80060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887480    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887481    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 54 1:426066                                                                                                                                                                                                                                                           265006240       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887482    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426066                                                                                                                                                                                                                                                          265006271       0   0X5280060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887483    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887484    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425614                                                                                                                                                                                                                                                          265006271       0   0X8E7E060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887485    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                    Lock:Deadlock Chain 17887486    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:426687                                                                                                                                                                                                                                                          265006271       0   0XBF82060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887487    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887488    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:425392                                                                                                                                                                                                                                                          265006271       0   0XB07D060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887489    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887491    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887493    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887494    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:435792                                                                                                                                                                                                                                                          265006271       0   0X50A6060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock Chain 17887495    1       0X01    4   myserver        2008-11-28 10:16:46.210 Parallel query worker thread was involved in a deadlock                                                                 0           971497  102 - Resource type Exchange                
Lock:Deadlock Chain 17887496    1       0X01    4   myserver        2008-11-28 10:16:46.210 Deadlock Chain SPID = 209 1:438206                                                                                                                                                                                                                                                          265006271       0   0XBEAF060001000000000000001B0006        27              0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971497  101 - Resource type Lock                
Lock:Deadlock   17887497        myuser  0XCD85FBB269700B4AA2F4E8579D118999  209 myserver    myuser  2008-11-28 10:16:45.930 1:426206    265006271   myapps  0   0XDE80060001000000000000001B0006    123 27  281 2008-11-28 10:16:46.210 myclient    0 - LOCK    4 - U           0   72057594040352768   1 - TRANSACTION 0   6 - PAGE    mydatabase  971498                  
Était-ce utile?

La solution 6

Je dois enfin faire une solution de contournement en utilisant cusror dans une procédure stockée.

Mais il est toujours intéressant de savoir comment le verrouillage de la page se produit et comment le résoudre.

Après quelques recherches supplémentaires sur Google, d'autres personnes ont le même problème et (de MSDN forum) suggèrent de désactiver le parallélisme dans SQL Server 2005, mais je n'ai jamais eu l'occasion d'essayer.

Autres conseils

Vous avez 2 options pour réduire l'escalade de verrous:

1) Ajoutez l’indicateur WITH (ROWLOCK) pour demander au serveur SQL de prendre des verrous de granularité plus fins (votre kilométrage peut varier:

  

UPDATE table WITH (ROWLOCK) SET   colonne = @ P1 O PK = @ P2; Tant que PK   varchar (11), a un index clusterisé sur   il. pas de relation tigger ou table..etc   sur la table.

2) mettez à jour les lignes dans un ordre aléatoire, ce qui réduit le risque que les verrous de lignes deviennent des verrous de page.

De plus, le fait de s'assurer que les index de cette table sont à jour peut souvent réduire le verrouillage. Comme le peut le fait de laisser un facteur de remplissage (90, c'est bien) si vous allez faire beaucoup d'inserts.

Avez-vous exécuté une trace de profil?

Lancez SQL Profiler et créez une trace standard avec ces événements ajoutés:

  • Verrous: graphe de blocage
  • Verrous: Verrou: Chaîne de blocage
  • Verrous: Verrou: Escalade

Devrait devrait fournir des détails sur la nature précise de l’impasse.

Dans les cas simples et normaux, ce type d’origine est rarement observé. Ma question est la suivante: qu'y a-t-il de l'autre côté de cette transaction? Quelle est l'autre instruction de mise à jour en cours d'exécution et à l'origine de ce blocage? Je pense que ce sera la clé pour diagnostiquer ce problème. Honnêtement, mon argent est sur cette autre requête, non identifiée auparavant, étant le coupable. Et je suis à Vegas maintenant ...

Quelles instructions select de la même table ET les mêmes enregistrements se produisent-ils dans la même transaction avant l'instruction update? Utilisez des astuces de verrouillage (mises à jour) dans ces sélections.

avez-vous des déclencheurs UPDATE sur la table? Si tel est le cas, l’action du déclencheur pourrait être à l’origine de votre impasse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top