我正在尝试了解 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 块中?JMS 和消息系统也是如此。
- 在 JPA/JDBC/JMS 之外,还有哪些使用 JTA 来处理一系列操作的用例?
提前致谢!