J'appelle les instructions de mise à jour l'une après l'autre à partir d'un servlet vers DB2. Je reçois une erreur sqlstate 40001, code de raison 68 que j'ai trouvé dû à un délai d'attente de blocage.
Le code anomalie 68 vous indique déjà que cela est dû à un délai d'expiration de verrouillage (l'impasse est le code anomalie 2). Cela peut être dû à d'autres utilisateurs exécutant des requêtes en même temps qui utilisent les mêmes données auxquelles vous accédez, ou à vos propres mises à jour multiples.
Commencez par exécuter db2pd -db locktest -locks show detail
à partir d'une ligne de commande db2 pour voir où se trouvent les verrous. Vous devrez ensuite exécuter quelque chose comme:
select tabschema, tabname, tableid, tbspaceid
from syscat.tables where tbspaceid = # and tableid = #
en remplissant les symboles # avec le numéro d'identification que vous obtenez du db2pd
sortie de la commande.
Une fois que vous voyez où se trouvent les verrous, voici quelques conseils:
FrequencyLa fréquence de verrouillage peut parfois être réduite en garantissant que toutes les applications accèdent à leurs données communes dans le même ordre - ce qui signifie, par exemple, qu'elles accèdent (et donc verrouillent) les lignes du tableau A, suivi du tableau B, puis du tableau C, et bientôt.
extrait de: http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.trb.doc/doc/t0055074.html
lecture recommandée: http://www.ibm.com/developerworks/data/library/techarticle/dm-0511bond/index.html
Addendum: si votre servlet ou une autre application coupable utilise des déclarations select
trouvées impliquées dans l'impasse, vous pouvez essayer d'ajouter with ur
aux instructions select si l'exactitude des données nouvellement mises à jour (ou insérées) n'est pas importante.