|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre actif
![]() Inscription : février 2007 Messages : 167 ![]() |
Bonjour,
Il y a un soucis de deadlock sur mon appli. Je connais l'ordre SQL qui est bloqué et son emplacement dans le package PLSQPL concerné grâce au fichier trace généré par Oracle. Reste à déterminer l'emplacement de l'ordre SQL qui a bloqué la ligne. Dans le cas de mon autonomous transaction le scénario est le suivant : La transaction mère supprime une ligne. Elle appelle une procédure autonome qui supprime la même ligne. La fille attend que la mère libère la ligne avec un commit. Elle ne rend donc pas la main à la mère qui est bloquée à son tour. => Deadlock Pour éviter cela nous utilisons une règle qui dit qu'une table est géré que par transaction autonome ou sans aucune transaction autonome. (tout ou rien). Pas dur. Sauf que là je pense que cette règle a été transgressée. Ma question est : "Est ce que le contenu du fichier trace (15250 lignes) est sensé me donner l'emplacement (PlSql + Sql) du verrouillage de la ligne ?" J'ai fureté un peu, lu le doc 62365.1 mais l'interprétation du fichier trace me semble peu documentée. Une idée ? Pozzo Je suis donc à la recherche de l'odre delete |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Bonjour,
SQL_TRACE (event 10046) ne donnera pas directement qui a posé un lock, mais peut permettre de le deviner en regardant les requêtes qui peuvent avoir touché la ligne en question. Les locks peuvent être tracés par l'event 10704. Si c'est un verrou TM (niveau table) on le voit. Si c'est un verrou TX (niveau ligne) alors les verrou TM correspondant (mode 2 ou 3) donnera peut être un indication. Mais probablement pas besoin d'aller jusque là. C'est au design qu'il y a un problème. Pour quelle raison cette autonomous transaction ? Les cas qui justifient son utilisation sont très rares. Cordialement, Franck.
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
10
|
|
|
#3 |
|
Membre actif
![]() Inscription : février 2007 Messages : 167 ![]() |
Merci Pacho,
Je vais regarder dans la direction du 10704. Plutôt que le 10046 je pense aussi faire un trigger en utilisant "who called me" ça sera moins vaste à dépouiller. Pour répondre à ta question oui c'est un problème de design. Plus exactement un problème ne non respect des règles imposées par le design. Sur l'appli 3 tables ne doivent pas dépendre de la session principale. Ce sont des tables de log : Un traitement peut effectuer un rollback ou un commit mais la log est toutjours "commitée" car quoi qu'il se passe on doit pouvoir le savoir. J'utilise donc une transaction autonome. Il se trouve qu'une action dans la session mère manipule certainement les mêmes données d'où le deadlock et ma recherche. En tout cas merci. En revanche j'ai cherché à droite et à gauche mis à part Larry Ellison et l'ainé de ses neveux (le rouquin sympa mais un peu énervant) personne ne semble savoir comment analyser complètement la log générée par un deadlock. A+ Pozzo |
|
|
00
|
|
|
#4 | ||
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Citation:
Citation:
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
||
|
00
|
|
|
#5 |
|
Membre actif
![]() Inscription : février 2007 Messages : 167 ![]() |
Oui la transaction principale est bien fautive.
Retrouver le rowid ne m'avancera pas à grand chose et il est dedans. C'est le programme (ou la requête à partir de laquelle je tenterai de trouver le programme) que je cherche. Je poste le rapport. Merci |
|
|
00
|
|
|
#6 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Citation:
Sinon, en examinant, le tkprof tu verras toutes les requêtes. Peut-être que tu pourras identifier lesquelles sont susceptibles de vérouiller la table en question (pas toujours évident lorsque c'est vérouillé par de l'intégrité référentielle).
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#7 | ||||
|
Membre actif
![]() Inscription : février 2007 Messages : 167 ![]() |
Merci Patcho,
Cela me semble astucieux. Pour le moment je continue sur mon fichier trace (que j'ai attaché à ce message). Voici le genre de ligne qui s'y trouve. Ce que fait la session bloquée est clairement identifié en tête de fichier : Code :
La ligne 375 du package PKG_IDENTIFIANTS émet un ordre delete et se trouve bloquée. Je pense (j'espère) que le reste du fichier est consacré à "l'autre" session. C'est plutôt moins lisible. En recherchant le mot clé DELETE je tombe sur des blocs de cette forme : Code :
Je suppose que c'est l'objet (LIBRARY OBJECT: object=)c0000000ee950e10. Si c'est de l'hexa ça fait de l'objectid = 4031425232 Franchement pour un objectid je trouve ça un peu gros. Comprends pas. Pozzo |
||||
|
|
00
|
|
|
#8 | |
|
Membre Expert
![]() ![]() Franck PachotDBA Oracle Inscription : novembre 2007 Messages : 706 ![]() |
Citation:
C'est un verrou sour une ligne (TX mode X) et la seule information qui est enregistrée est: la ligne XXX est vérouillée par la transaction YYY. Rien d'autre. Le SQL qui a vérouillé l'a peut être fait longtemps avant, et la transaction a peut-être fermé et ouvert plein de curseurs...
__________________
A lire sur mon blog Oracle - Articles d'Experts des articles traduits en français de Jonathan Lewis, Tom Kyte, Doug Burns, Cary Millsap, Greg Rahn ...
|
|
|
00
|
|
|
#9 |
|
Membre actif
![]() Inscription : février 2007 Messages : 167 ![]() |
Merci Pachot de ce tout ce temps passé.
Je suis assez déçu par la trace. Dans mon cas cela aurait été pratique car l'incident est en prod chez un client. C'est facile de demander un fichier mais c'est compliqué de demander des manips ou d'installer un programme modifier juste pour diagnostique. C'est pourtant ce que j'ai involontairement fait. En tentant un contournement dans mon programme c'est l'autre "session" qui s'est retrouvée bloquée. J'ai donc eu toutes les infos sur la ligne qui bloquait. Comme supposé c'était un delete sur la table en direct sans utiliser la routine autonome. Le problème est donc réglé. Merci encore pour ton aide. Je clos le sujet. Pozzo |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com