Bonjour,
pour Exemple: Mon application comporte deux EJB sessions stateless, et trois EJB entity CMP. Voici l'exemple de code
EJBSession ejbsession1 {
save(param1, param2, param3) {
ejbEntity1.create(param1, param2);
while (notFinished) {
ejbSession2.save(param3);
}
}
}
EJBSession ejbsession2 {
save() {
ejbEntity3.findByPrimarykey(param3);
ejbEntity2.create();
}
}
Mon souci: Lorsque un premier traitement appelle la méthode save de ejbsession1, puis qu'un deuxième traitement appelle également cette méthode avant la fin du premier, je me retrouve avec un deadlockException lors du finder sur ejbEntity3 du traitement 2.
D'après moi, une transaction est ouverte en mode mise à jour dès le début du save de ejbsession1. Dès lors, les créations, ainsi que les finders de la méthode save de ejbsession2 sont au sein de cette transaction, et du coup le finder vérouille la table, selon le principe "SELECT...FOR UPDATE".
Quand mon deuxième traitement passe, et essaye d'effectuer le finder sur le même enregistrement, il se retrouve en concurrence et me lève une exception.
essai 1- Paramétrage de la méthode findByPrimary de ejbEntyty3 en demandant de n'être dans aucune transaction ("NOT Supported" dans le descripteur de déploiement).
résultat essai1- Gel du traitement lors du finder, rien ne se passe
essai 2- Paramétrage des tentatives d'accès (access-intent) de l'ejbEntyty3 en "PessimisticRead" dans le descripteur de déploiement, avec espoir que du coup aucun vérouillage ne serait fait, même au sein d'une transaction de Mise à jour
résultat essai2- Gel du traitement lors du finder, rien ne se passe.
Je ne sais pas si cela est clair.
Quelqu'un aurait-il une idée?
Merci d'avance pour votre aide.
Partager