JtaTransactionManager和ChainedTransactionManager之间的区别?

时间:2015-10-18 20:24:52

标签: java spring transactions spring-transactions

我需要管理应用中的多个资源,例如 jms 数据库

在查看可管理多种资源的交易管理人员时,我遇到了2位交易经理 JtaTransactionManager ChainedTransactionManager ,他们几乎声称可以管理多种资源。

任何人都可以解释它们的主要区别吗?什么时候应该使用哪一个?

2 个答案:

答案 0 :(得分:5)

正如文件所说: ChainedTransactionManger doc

  

PlatformTransactionManager实现,它将事务创建,提交和回滚编排到委托列表中。使用此实现假定导致事务回滚的错误通常发生在事务完成之前或提交最内部PlatformTransactionManager期间。   配置的实例将按给定的顺序启动事务,并以相反的顺序启动/回滚,这意味着最有可能破坏事务的PlatformTransactionManager应该是配置列表中的最后一个。在提交期间抛出异常的PlatformTransactionManager将自动导致剩余的事务管理器回滚而不是提交。

这意味着您可以通过向其传递几个transactionmanager来创建ChainedTransactionManager。如果一个事务管理器发生异常,将按照指定的相反顺序为所有事务管理器生成回滚

JtaTransactionManager doc

  

JTA的PlatformTransactionManager实现,委托给后端JTA提供程序。这通常用于委派给Java EE服务器的事务协调器,但也可以配置为嵌入在应用程序中的本地JTA提供程序。   该事务管理器适用于处理分布式事务,即跨越多个资源的事务,以及用于控制应用程序服务器资源上的事务(例如,JNDI中可用的JDBC数据源)。对于单个JDBC DataSource,DataSourceTransactionManager是完全足够的,并且对于使用Hibernate(包括事务缓存)访问单个资源,HibernateTransactionManager是合适的,例如。

您可以使用此事务管理器来管理多个资源的分布式事务

答案 1 :(得分:3)

两个事务管理器都适合与多个资源一起使用,但是 JTA 事务管理器提供了一个严格的保证,它要么提交所有资源,要么不提交任何资源。它使用 XA 协议通过 2PC(两阶段提交)实现。由于这是一种保持资源同步的复杂方法,因此会以性能为代价。

相反,ChainedTransactionManager 不使用 2PC 和 XA,它更像是一种声明多个资源应该一起提交或回滚并以特定(反向)顺序提交的方法。像 JTA 事务管理器一样,它尝试一起提交或回滚所有资源,但它不保证(全部提交或全部回滚)。但是在特定情况下它是完全没问题的。 假设两个资源与链式事务管理器一起使用:JMS 相关和 DB 相关,以便在事务期间您首先从队列中读取消息,然后处理一些涉及 DB 的业务逻辑,最后提交这两个资源。如果首先提交 DB,然后提交 JMS,那么 DB 提交但 JMS 回滚是可能的。在这种情况下,初始消息将留在消息队列中,这并不完全正确,并且可能会导致重复的消息处理(因为消息已经被处理并导致成功的数据库提交)。但是,如果您的业务逻辑已为此做好准备,您可以处理这种情况——当然,代价是额外的代码实现。但是,如果性能更重要,那么这是一个合理的交易,因为 ChainedTransactionManager 的执行速度应该比 JTA 快得多。

注意。与 ChainedTransactionManager 一起使用的事务管理器的顺序很重要:最有可能破坏事务的事务管理器应该是配置列表中的最后一个。

底线。如果您可以安全地处理一个资源提交而另一个回滚的情况,或者这种情况很少发生而您可以忽略它,那么您可以先尝试使用 ChainedTransactionManager。 如果性能不是那么重要和/或您想绝对确保多个资源同步,那么您可能应该使用 JTA。