2009-08-14 11 views
1

Une application déployée sur plusieurs machines - accède à la même table DB. Il lit la ligne MIN puis supprime cette ligne. Lorsque cela se produit simultanément, nous obtenons une erreur -913 de DB2 signifiant un interblocage.Hibernate/DB2 -913 deadlock

Avez déjà essayé les options suivantes 1. verrous sur la rangée. 2. réessayez le mécanisme dans le code de l'application, après le blocage.

Rien ne semble fonctionner.

Des idées/références/solutions?

TY

Répondre

1

Vérifiez le code de motif associé à votre SQL0913N pour déterminer si le problème est en fait une impasse (code de raison 2) ou tout simplement un délai d'attente de verrouillage (> 2). Si le problème est réellement un interblocage, vous pouvez capturer des informations détaillées sur les interblocages en activant un moniteur d'événements DB2 pour les interblocages. Si vous ne capturez pas déjà les instructions spécifiques générées en votre nom par Hibernate, vous pouvez également définir et activer un moniteur d'événements d'instructions SQL pour capturer autant de détails que possible.

Le niveau d'isolation utilisé par Hibernate peut avoir un impact important sur la concurrence. Généralement, les applications rencontrent moins de verrouillage lorsqu'elles peuvent effectuer des lectures incorrectes via l'isolation de lecture non validée, mais cette approche n'est pas idéale car elle expose des données non validées et compromet les propriétés ACID de DB2. Si vous avez déjà activé les lectures incorrectes, il est possible que cela contribue à votre problème spécifique car les lignes qui ont des modifications non validées sont visibles à partir d'autres connexions au lieu d'être verrouillées.

La conception de votre application (accès multi-thread à une file d'attente de travail unique) n'est peut-être pas idéale et pourrait éventuellement bénéficier d'un refactoring. Le problème des philosophes de salle à manger offre une variété de modèles de solution pour réduire la contention. En fonction des spécificités de votre application, vous pourrez peut-être modifier le traitement des lignes, par exemple en définissant un indicateur d'état, ce qui aidera les autres threads à comprendre que cette ligne est déjà traitée par un autre thread et peut être ignorée . Il est également possible qu'un ajustement mineur des limites de vos transactions, résultant en des commits plus fréquents, puisse atténuer le problème. L'une des améliorations les plus remarquables de DB2 9.7 (publiée en juin 2009) est l'amélioration de l'isolation Cursor Stability qui permet d'accéder à la version actuellement validée d'une ligne verrouillée.

Questions connexes