Estoy tratando de entender JTA y estoy usando Bitronix como el administrador de transacciones de su elección (solo por el bien de aprender y entender). Estoy mirando el código dentro del Bitronix reference guide here y me pregunto a mí mismo: Si estoy usando JDBC, que a su vez es transaccional (Connection
puede confirmarse/retrotraerse), ¿por qué querría escribir código así? !?!Java EE: ¿Por qué usar JTA directamente?
Ahora tal vez el objetivo de ese fragmento de código era simplemente demostrar cómo usar Bitronix/JTA sobre un almacén de datos transaccional existente, pero aún no obtengo los beneficios inherentes que ofrece.
Luego, este fragmento de código me hizo pensar: "Si las dos únicas fuentes de datos principales que utiliza son bases de datos y intermediarios de mensajes, y usa JDBC/JMS para comunicarse con ellas, respectivamente, y estos dos estándares (JDBC/JMS) ya son transaccionales, ¿por qué necesitarías usar JTA en absoluto?!?! "
Es JTA una especie de API" interna "de Java EE que utilizan JDBC, JPA, JMS, etc. y solo está expuesto públicamente para el 1% de las personas que quieren hacer algo loco con eso? ¿O me estoy perdiendo la idea/aplicabilidad de JTA por completo?
Supongo que podría imaginar dos casos de uso no JDBC y no JMS para golpear JTA directamente, pero como soy muy confuso con JTA, en primer lugar no tengo idea si estos casos están desviados o no :
- Quizás tenga un sistema de E/S complicado en su aplicación y tenga varios hilos que leen/escriben desde el mismo archivo en el disco. Tal vez debería hacer que cada hilo use una transacción para escribir en este archivo. (¿Sí?!? No?!?)
- Quizás tenga una máquina de estados POJO que represente el estado de un sistema, y varios hilos pueden modificar la máquina. Quizás tendrías que cada hilo usa una transacción para alterar el estado de la máquina.
supongo que en la raíz de mi pregunta es (Sí No?!?!?):
- Si mi JPA (Hibernate) y/o las llamadas JDBC ya son transaccionales, ¿por qué habría de hacerlo ¿Quieres envolverlos dentro de JTA begin-> commit/rollback block? Lo mismo para JMS y sistemas de mensajería.
- Fuera de JPA/JDBC/JMS, ¿qué casos de uso existen para usar JTA para realizar una serie de operaciones?
¡Gracias de antemano!
Gracias por la excelente respuesta @Justin (+1). ¿Qué pasa con los ejemplos que estoy citando (lectura de archivos, manipulación de estados, etc.)? ¿Son aquellas instancias en las que uno quisiera realizar transacciones (por qué o por qué no)? Si es así, ¿tendría que implementar mi propio 'XAResource' para ellos? ** Nuevamente, para la recompensa, estoy buscando un conjunto de pautas para usar al decidir si se debe o no tramitar algo. ** ¡Gracias de nuevo! – IAmYourFaja
@AdamTannon gracias por el +1! Agregué algunas de mis propias líneas de guía, espero que sean útiles. – Justin
Awesome, awesome answer. ¡Gracias! – IAmYourFaja