Reversión de transacciones EJB3


Estoy usando CMT en EJB3 session-less beans. También he creado mi propia Excepción con la anotación " @ ApplicationException (rollback=true)".

  1. Tengo que usar "contexto".setRollbackOnly ()" ¿cuándo quiero revertir la transacción?

  2. ¿Puedo simplemente revertir la transacción lanzando una excepción dentro del método público en el bean?

  3. Si es así (la respuesta a Q # 2 es sí) tengo que tirar la excepción fuera del método declarando el excepción en el método o ¿será suficiente simplemente lanzar una excepción dentro del método y manejarla dentro del mismo método? (No quiero propagar la excepción al siguiente nivel. Sólo quiero revertir la excepción.)

Gracias de antemano. ;)

Author: ruwan.jayaweera, 2010-03-02

2 answers

En primer lugar, no hay reversión de una excepción, es una reversión de una transacción.

  1. Si arroja su excepción con @ApplicationException(rollback=true), no tiene que revertir la transacción manualmente. Context.setRollbackOnly() fuerza al contenedor a revertir la transacción, también si no hay excepción.
  2. Una excepción marcada por sí misma no revierte una transacción. Necesita tener la anotación @ApplicationException(rollback=true). Si la excepción es un RuntimeException y la excepción no se detecta, obliga al contenedor a revertir transacción. Pero cuidado, el contenedor en este caso descartará la instancia EJB.
  3. Como se menciona en 2.), si lanza un RuntimeException, la transacción se revertirá automáticamente. Si detecta una excepción marcada dentro del código, debe usar setRollbackOnly para revertir la transacción.

Para más información, echa un vistazo al libro gratuito Mastering EJB. Describe muy bien los escenarios de reversión y es gratis para descargar.

 66
Author: Steve,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-11 15:12:28

La pregunta de cómo evitar que las excepciones marcadas declaradas anotacionalmente causen una reversión al lanzar se propaguen a la "capa superior" aún no se ha respondido aquí.

Creo que esto requerirá una envoltura alrededor de la EJB en cuestión que se traga la excepción lanzada. (En otras palabras: Creo que la excepción personalizada DEBE lanzarse contra el límite del método (y por lo tanto no atrapada y procesada dentro del método) y propagarse para tener efecto transaccional -- y también a su vez causará la destrucción de la instancia EJB.)

 0
Author: Christian Gosch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-15 13:18:14