Java EE:为什么直接使用JTA?

IAm*_*aja 20 jta java-ee

我正在尝试理解JTA并使用Bitronix作为首选的事务管理器(仅仅是为了学习和理解).我正在查看Bitronix 参考指南中的代码,我对自己感到疑惑:如果我使用的是JDBC,它本身就是事务性的(Connection可以提交/回滚),为什么我要编写这样的代码呢? !?!

现在,该代码片段的目的可能只是演示如何在现有的事务数据存储上使用Bitronix/JTA,但我仍然没有获得它提供的固有优势.

然后,这段代码让我想到:" 如果您使用的唯一两个主要数据源是数据库和消息代理,并且您使用JDBC/JMS分别与它们通信,并且这两个标准(JDBC/JMS)已经是事务性的,那么为什么你需要使用JTA?!?! "

JTA是某种JDBC,JPA,JMS等都使用的"内部"Java EE API; 只有1%的人想要做一些疯狂的事情才公开曝光?或者我完全错过了JTA的想法/适用性?

我想我可以设想两个非JDBC和非JMS用例来直接命中JTA,但由于我在JTA上这么模糊,我不知道这些情况是否偏离轨道:

  • 也许您的应用程序中有一个复杂的I/O系统,并且有多个线程从磁盘上的同一文件读取/写入.也许你会让每个线程使用一个事务来写入这个文件.(是吗?!?不?!?)
  • 也许你有一个表示系统状态的状态机POJO,多个线程可以修改机器.也许你会让每个线程使用一个事务来改变机器的状态.(是吗?!?不?!?)

我想我的问题的根源是:

  • 如果我的JPA(Hibernate)和/或JDBC调用已经是事务性的,为什么我要将它们包装在JTA begin-> commit/rollback block中呢?同样适用于JMS和消息传递系统.
  • 在JPA/JDBC/JMS之外,使用JTA处理一系列操作有哪些用例?

提前致谢!

Jus*_*tin 25

它不仅仅是回滚开放事务,JTA提供了一个供应商可以实现的XAResource接口,您的JDBC驱动程序和JMS提供程序已经实现了这一点,您可以实现自己的.这是基于开放标准,可能值得一读.

现在我们为什么要这个呢?

在灾难中考虑马修斯的例子:

Begin DB Transaction

Set AccountBalance $100 lower for Account #345 in database

Add JMS Message "Transfer $100 to OtherBank Account #987" to queue

*** DB power is unplugged while committing DB Transaction ***
Run Code Online (Sandbox Code Playgroud)

不幸的是,JMS消息已经转移到另一个银行,这是分布式事务的一个非常现实的问题.

使用XA,这就是场景的演绎方式:

DB Transation starts XA Transaction

Set AccountBalance $100 lower for Account #345 in database

JMS Connection joins XA Transaction 

Add JMS Message "Transfer $100 to OtherBank Account #987" to queue

Everything went okay and JTA context is ready to commit.

DB and JMS both agree that they are capable of commiting.

JTA instructs DB and JMS to commit.

All members of the transaction commit.
Run Code Online (Sandbox Code Playgroud)

现在您可能会问,如果在DB最终提交期间拔出电源插头会发生什么.那么JMS队列将提交,但是XA事务将保持打开,直到DB再次可用,此时它将再次指示DB提交(DB承诺我们可以提交,这是符合XA的一部分) ).

JTA真正的优点是你可以轻松实现自己的自定义XAResource并与这个伟大的框架相结合!

UPDATE

因此,要回答有关何时实施自定义事务的问题,您可以问自己以下内容:

  1. 您的自定义状态或文件UNABLE是事务范围中的最终代码块吗?
  2. 您是否需要在外部系统(即DB或JMS)故障时恢复自定义状态/文件?
  3. 外部系统是一个简单的getRollbackOnly()和setRollbackOnly(),加上补偿处理(即显式恢复自定义状态/文件),您的自定义代码不足?

如果1,2和3的答案都是YES,那么你可能想要一个自定义的XAResource,否则我认为它可能有点过分.

但是,如果您的代码是将由Java EE空间中的业务逻辑登记的框架或库,您可能希望为其实现XAResource!