J'utilise Hibernate 2.6 avec hibernate-entitymanager. J'essaie d'attraper et de gérer des situations lorsque 2 transactions sont en conflit sur un objet. Voici ce qui se passe:Comment détecter les conflits de transaction avec Hibernate?
Deux threads mettent à jour un seul objet avec un champ @Version. Le thread qui perd la course enregistre les logs StaleObjectStateException sur flush. L'exception n'est pas levée, elle est simplement enregistrée. Je suppose que la transaction est annulée à ce moment-là. Ensuite, lorsque le thread tente d'effectuer la validation, il échoue avec RollbackException. Je n'ai pas trouvé de moyen de savoir dans le code pourquoi la transaction est annulée.
Y at-il un moyen d'attraper et de gérer de telles situations dans le code? Fondamentalement, je veux attraper StaleObjectStateException, mais le problème est - il n'est pas levé.
MISE À JOUR: La chose que je suis en train d'accomplir du point de vue des yeux des oiseaux est la suivante:
J'ai une application J2EE fonctionnant sous JBoss. Il a quelques services invoqués par minuterie interne et ceux invoqués à partir de l'interface utilisateur. Il a également une entité critique. Je dois m'assurer que des threads différents ne peuvent pas mettre à jour simultanément des objets de cette classe d'entités, car cela peut entraîner une incohérence de données. C'est pourquoi je suis en train de mettre en œuvre un verrouillage optimiste.
Lorsqu'un problème de verrouillage optimistick se produit, j'essaie de gérer cette situation en général. Je veux l'attraper au niveau très élevé et montrer un message d'utilisateur valide (dans mon cas le plus haut niveau est ExceptionMapper pour RestEasy). Le problème est - quand j'attrape RollbackException - il est déjà trop tard.
Je ne vidange pas manuellement. La plupart de mes EJB utilisent CMT et les sessions sont vidées automatiquement.
J'ai mis à jour ma réponse en fonction de votre clarification – ChssPly76