2010-11-26 35 views
0

J'essaie de comprendre comment les interblocages peuvent être gérés en utilisant ESQL. J'ai créé 2 processus simultanés qui essayent de mettre à jour une table "clients", exactement comme l'exemple donné dans le livre "Base de données" d'O'Neil: http://books.google.ca/books?id=UXh4qTpmO8QC&pg=PA298&lpg=PA298&dq=%22deadabort%22+oracle&source=bl&ots=2QF7eSbaW6&sig=IcEZtSXINKrOVro1UN-ShlNsAak&hl=en&ei=9BPvTKPfMtP4nwfqu_X1Cg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBcQ6AEwAA#v=onepage&q=%22deadabort%22%20oracle&f=falsesqlcode ne retourne pas DEADABORT lorsque le blocage se produit dans ESQL

Mais pour une raison quelconque, le processus 2 qui attend 1 pour terminer les blocs à l'instruction "exec sql mise à jour des clients", et n'entre jamais l'instruction "if (sqlca.sqlcode == DEADABORT)". Par conséquent, je ne peux jamais gérer l'impasse.

Quelqu'un a-t-il une idée?

+0

Je n'arrive pas à voir le livre. Ce serait mieux si vous pouviez montrer les SQLs que vous utilisez. –

Répondre

0

Sans voir le code, il est difficile de commenter, mais une erreur de blocage de la base de données va être très difficile (voire impossible) à produire dans un seul programme fileté, même si vous avez deux connexions.

dans un seul programme fileté

  • connexion A verrous rangée R1.
  • La connexion B verrouille la rangée R2.
  • Connection A essaie de bloquer la ligne R2 et attend

Il n'a pas atteint la condition de blocage car la connexion A est simplement en attente sur la connexion B. La base de données ne sait pas que les deux connexions de base de données sont d'un seul processus/thread afin qu'il ne sache pas qu'ils sont bloqués.

Ce problème surgit parfois avec des pools de connexion. Une session d'utilisateur final verrouille une ressource partagée à l'aide d'une connexion du pool. Les autres connexions de pool remplissent toutes les attentes sur cette ressource partagée, puis cette session d'utilisateur final d'origine ne peut pas obtenir un thread de pool de connexions pour libérer la ressource.