with type tutorial transaction significa que ejemplo java jpa java-ee jta

java - type - transaction with jta



¿Cuál es la diferencia entre @Resource UserTransaction y EntityManager.getTransaction() (3)

Además de la respuesta de @ Marco, que hace bien en diferenciar entre JTA y las transacciones locales de recursos.

Las Transacciones Administradas por Contenedor son [como se denominan] administradas por el contenedor en lugar de su aplicación. Esto se hace a través del nivel EJB donde solo necesita escribir su método y el contenedor ajustará el método en un contexto de transacción, de modo que si alguna parte de su método o sus llamadas de nivel inferior lanza una excepción, la transacción se revertirá.

También se puede ajustar con anotaciones. Puede encontrar más información aquí https://docs.oracle.com/javaee/5/tutorial/doc/bncij.html

Tenga en cuenta que esto solo se realiza a través de EJB, y los gestores de entidades que se inyectan en el nivel web (p. Ej. Servlets o REST API) no son gestionados por el contenedor, en cuyo caso debe buscar la transacción utilizando @Resource UserTransaction o EntityManager.getTransaction , begin() y commit() usted mismo.

Desde Java EE 6 puede tener EJB dentro del nivel web, por lo que no necesita tener un diseño de proyecto excesivamente complejo a menos que empiece a querer exponer sus EJB como servicios web.

¿Alguien puede explicar cuál es la diferencia entre:

@Resource UserTransaction objUserTransaction;

y

EntityManager.getTransaction();

Y también, ¿qué es una transacción administrada por contenedor? y cómo debería hacerlo en la fachada de mi sesión si quiero insertar tres filas en la tabla de transacción.


EJB son componentes transaccionales. La transacción puede ser gestionada por el propio servidor de aplicación (CMT - transacción gestionada por contenedor), o manualmente por usted mismo dentro del EJB (BMT - transacción gestionada por bean).

EJB admite transacciones distribuidas a través de la especificación JTA. La transacción distribuida se controla utilizando UserTransaction , que tiene los métodos begin , commit , rollback .

Con CMT, el servidor de aplicaciones se inicia, confirma y retrotrae la transacción (de acuerdo con las anotaciones de transacciones ) por usted y no puede interferir. Esto significa que no debe acceder al UserTransaction en este caso. Sin embargo, con BMT, usted hace eso manualmente y usted mismo controla la transacción usando UserTransaction .

Pasemos ahora a EntityManager . Una implementación de JPA se puede usar dentro de un servidor de aplicaciones o independiente. Si se usa de forma autónoma, debe usar EntityManage.getTransaction para demarcar la transacción JDBC usted mismo. Si se usa dentro de un servidor de aplicaciones, EntityManager cooperó con el administrador de transacciones distribuido JTA de forma transparente para usted.

La mayoría de las veces, usa CMT con la anotación @Required en el EJB. Esto significa que no necesita acceder ni UserTransaction ni EntityManager.getTransaction . La aplicación. el servidor inicia y confirma la transacción, pero también se encarga de deshacer si se produce una excepción. Esto es lo que recomendaría para su fachada.

(Hay más sutilezas, como PersistenceContextType o el alistamiento manual del administrador de entidades en la transacción distribuida con EntityManager.joinTransaction , pero eso solo si usa las tecnologías de manera diferente como el predeterminado).


UserTransaction refiere a la entidad de transacción JTA . Solo podrá usar esto cuando haya un módulo JTA disponible en el servidor de aplicaciones: por ejemplo, si está implementando una aplicación con esto en Tomcat (que de manera predeterminada no admite JTA), el código que depende de esto fallará . Este es el tipo predeterminado de transacción utilizado en EJB y MDB.

EntityManager.getTransaction() recupera una entidad de transacción local . Esto también a veces se conoce como una transacción local de recursos.

Las transacciones locales de recursos son muy diferentes de las transacciones JTA: entre otras cosas, las transacciones locales de recursos son específicas de un recurso, mientras que las transacciones JTA tienden a ser específicas para un hilo en particular.

Para obtener más información sobre la diferencia entre las transacciones de recurso local y JTA, consulte esta respuesta de aquí: ¿Cuál es la diferencia entre una JTA y una transacción local?