EJB Transactions dans les locaux de la méthode des appels
Dans la configuration suivante, n'méthode B exécuter dans un (nouveau) de la transaction?
Un EJB, ayant deux méthodes, Une méthode et la méthode B
public class MyEJB implements SessionBean
public void methodA() {
doImportantStuff();
methodB();
doMoreImportantStuff();
}
public void methodB() {
doDatabaseThing();
}
}
L'EJB est gérée par le conteneur, avec methodB dans requires_new de transaction, et la méthode A requis d'une transaction. donc:
<container-transaction id="MethodTransaction_1178709616940">
<method id="MethodElement_1178709616955">
<ejb-name>MyName</ejb-name>
<method-name>*</method-name>
<trans-attribute>Required</trans-attribute>
</method>
<method id="MethodElement_1178709616971">
<ejb-name>MyName</ejb-name>
<method-name>methodB</method-name>
</method>
<trans-attribute>RequiresNew</trans-attribute>
</container-transaction>
Maintenant, laissez un autre EJB appel methodA avec un EJB appel de méthode.
methodA fonctionne maintenant dans une transaction. Sera le prochain appel de methodB de methodA exécuter dans la même transaction, ou de ne l'exécuter dans une nouvelle transaction?
(de l'esprit, c'est le code ici. Il n'est pas explicite ejb-appel à la méthode B)
Vous devez vous connecter pour publier un commentaire.
Votre appel à
methodB()
est un banal appel d'une méthode, ne sont pas interceptées par le conteneur d'EJB; au moment de l'exécution le conteneur d'EJB qui permettra d'injecter un proxy et non pas une instance de votre classe, c'est la façon dont il intercepte les appels et la configuration de l'environnement avant d'appeler votre méthode. Si vous utilisezthis
vous appelez une méthode directement et non pas par le proxy. Ainsi, les deux méthodes utilisent la même transaction, indépendamment de ce qui est défini dans ejb-jar.xml pour les appels par le biais des interfaces de l'EJB.injecter SessionContext, et demandez pour votre proxy exemple:
dans 'invocation#1" c'est un appel Local, ne passant pas par le proxy, il sera de retour le comte
dans 'invocation#2" c'est un appel à travers le proxy, et, par conséquent, de les annoter pas à l'appui de la transaction qui est maintenant ouvert par créer(utilisateur) de la méthode, cette invocation va lancer une opération exception:
javax.ejb.EJBException: EJB ne peut pas être invoqué dans les transactions mondiales
Ils utilisent la même transaction.
Si je me souviens bien, la transaction est démarrée par le conteneur "avant", la méthode est invoquée et engage après avoir "fini".
Depuis "un" appels "b", "b" serait d'utiliser la même transaction.
:S
Je suppose que la meilleure chose que vous pouvez faire est de le tester pour vérifier qu'il! 🙂