web-dev-qa-db-fra.com

Annulation de transaction EJB3

J'utilise CMT dans les beans de session sans état EJB3. De plus, j'ai créé ma propre exception avec l'annotation "@ApplicationException (rollback = true)".

  1. Dois-je utiliser "context.setRollbackOnly ()" lorsque je veux annuler la transaction?

  2. Puis-je simplement annuler la transaction en lançant une exception dans la méthode publique dans le bean?

  3. Si c'est le cas (la réponse à la question 2 est oui), dois-je supprimer l'exception de la méthode en déclarant l'exception dans la méthode ou sera-t-il suffisant de simplement lever une exception dans la méthode et de la gérer dans la même méthode? lui-même? (Je ne veux pas propager l'exception au niveau suivant. Je veux simplement restaurer l'exception.)

Merci d'avance. ;)

30
ruwan.jayaweera

Tout d'abord, il n'y a pas d'annulation d'une exception, c'est une annulation d'une transaction. 

  1. Si vous lancez votre exception avec @ApplicationException(rollback=true), vous n'avez pas à annuler la transaction manuellement. Context.setRollbackOnly() force le conteneur à annuler la transaction, même s'il n'y a pas d'exception.
  2. Une exception cochée elle-même n'annule pas une transaction. Il doit avoir l'annotation @ApplicationException(rollback=true). Si l'exception est une RuntimeException et qu'elle n'est pas interceptée, le conteneur est tenu d'annuler la transaction. Mais attention, dans ce cas, le conteneur éliminera l'instance EJB.
  3. Comme mentionné en 2.), si vous lancez une RuntimeException, la transaction sera automatiquement annulée. Si vous attrapez une exception cochée dans le code, vous devez utiliser setRollbackOnly pour annuler la transaction.

Pour plus d'informations, consultez le livre gratuit Mastering EJB . Il décrit très bien les scénarios de restauration et est gratuit pour download .

67
Steve

La question de savoir comment empêcher les exceptions vérifiées annotalement déclarées de provoquer une annulation lors du lancement de la propagation vers la "couche supérieure" n'est pas encore résolue ici.

Je pense que cela nécessitera un wrapper autour de l'EJB en question qui avalera l'exception levée. (En d'autres termes: je pense que l'exception personnalisée DOIT être émise contre la limite de la méthode (et donc non capturée et traitée à l'intérieur de la méthode) ET propagée pour prendre effet transactionnel - et entraînera à son tour la destruction de l'instance EJB.)

0
Christian Gosch