BMT的完整编程是否基于UserTransaction接口?换句话说,如果我想使用 BMT,是否存在需要比 UserTransaction 接口提供的服务更多的服务的情况。
为什么这么问?如果我使用不同的事务管理器实现(例如 Bitronix TM 或 Atomikos)而不是容器提供的默认值,那么将新的 TM 注入 UserTransaction 对象就足够了吗?
-谢谢
这实际上仅限于应用服务器本身允许的内容;即,如果它明确支持替换事务管理器。
事务管理的真正艺术是容器向 TransactionManager 注册事务资源(DataSource 连接、JMS 会话、JPA EntityManager 等),方法是用同步对象包装它们,并通过Transaction或TransactionSynchronizationRegistry将它们注册到当前事务中
容器实现Synchronization
对象,TransactionManager 实现Transaction
和TransactionSynchronizationRegistry
对象。两者之间的协调是在事务运行时为您提供实际管理的原因。
BMT 和 CMT 只是告诉容器启动/停止事务的替代方法。在某些方面,术语“Bean-Managed”是错误的,因为UserTransaction
每个兼容的应用程序服务器都将由容器实现,因此它仍然是容器在工作。“容器管理”也有点误导,因为它仍然是 bean 开发人员决定何时启动/停止事务,它只是以声明方式与编程方式完成。对这些特性最准确的描述是程序化管理事务和声明式管理事务。在所有情况下,它仍然是 bean 与容器对话,容器和事务管理器完成所有工作。
尽管如此,您仍然可以更改事务管理器,OpenEJB 和 TomEE 支持它,但是它不会以您尝试的方式工作。请咨询您的供应商,看看这是否可行。
也许不能完全回答您的问题,但如果使用 BMT,您也可以使用资源本地事务管理器。在这种情况下,您不会使用(注入的)UserTransaction 接口。
请注意,只有在没有通过上述 UserTransaction 接口启动的事务正在进行的情况下,这才是合法的。