2015-08-23 1 views
1

J'utilise une transaction gérée par conteneur dans mon application EJB.Comment savoir si une méthode Java utilise ou non une nouvelle transaction JTA?

J'ai deux objets Java sans état, qui sont de classe A et classe B.

classe B est instancié dans une méthode de classe A.

dispose de deux méthodes de classe B: méthode A et la méthode B.

Méthode A utilise le type de transaction = REQUIRES_NEW

méthode B utilise le type d'opération requise =

Il y a Déclaration d'insertion de 2 sql dans les deux méthodes respectivement. La méthode A et la méthode B ont une instruction sql différente.

Je découvre que s'il y a une erreur dans la méthode B, tout dans la méthode A est l'annulation. Ce n'est pas ce que je veux. Je veux que tout dans la méthode A soit validé même si la méthode B soulève l'exception du système.

Ainsi, je ne pense pas que les méthodes A et B s'exécutent en utilisant une transaction différente. Puis-je savoir s'il existe un moyen pour system.out.println d'afficher une valeur booléenne indiquant qu'une transaction JTA est nouvelle ou non?

Merci.

Voici l'extrait de pseudo-code supplémentaire pour clarifier ma question ci-dessus.

stateless class A{ 
    method(){ 
    Class b = new Class B(); 
    b.methodA(); 
    b.methodB(): 
    } 
} 

stateless class B(){ 
    method A(){ // There is an insert statement here.} 
    method B(){ // There is another insert statement here.} 

    //If anything happen in method B, only rollback B, don't rollback A. 
} 
+0

La transaction associée au thread courant peut être obtenue à partir de TransactionManager (https://docs.oracle.com/javaee/7/api/javax/transaction/TransactionManager.html) et comparée à une autre par son code de hachage. –

+0

Si methodA a Requires_new, il ne devrait pas être annulé en cas de problèmes dans la méthode B, car elle devrait déjà être validée. Voir ce [post] (http://stackoverflow.com/a/10821117/3701228). Quel serveur utilisez-vous? – Gas

+0

Salut Gas. J'utilise weblogic Je doute fortement que le problème soit causé par le réglage du serveur weblogic. Mon code devrait fonctionner. –

Répondre

0

Vous exécutez la méthode B dans la même transaction que celle de la méthode A. si l'échec de la méthode B rollback l'insert qui se passe dans la méthode A.

exécuter à la fois les méthodes dans les différentes transactions si vous ne voulez pas que la méthode B interfère avec la méthode A.

Si vous utilisez Spring, vous pouvez utiliser TransactionSynchronizationManager pour connaître les informations sur le niveau de transaction.

+0

Puis-je savoir comment exécuter les deux dans différentes transactions? J'ai pensé que required_new et requis sont assez bons pour séparer les deux en deux transactions. –

+0

De toute façon, cela fonctionne dans EJB, pas Spring. Une idée? Beaucoup de tqs. –

+0

Dans quelle séquence, vous appelez methodA et methodB? –