JtaTransactionManager和ChainedTransactionManager之间的区别是什么?

18
我需要管理应用程序中的多个资源,例如jms和数据库。在查看可以管理多个资源的事务管理器时,我发现有两种事务管理器:JtaTransactionManager和ChainedTransactionManager,它们几乎声称可以管理多个资源。有人能解释一下它们之间的主要区别吗?我应该在什么情况下使用哪个?
2个回答

6
根据文档所述:ChainedTransactionManger doc

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

这意味着您可以通过向其传递多个transactionmanager来创建ChainedTransactionManager。如果一个transaction manager发生异常,那么将以相反的顺序生成所有transaction managers的回滚。 JtaTransactionManager doc

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

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

3
两个事务管理器都适用于多个资源的使用,但是JTA事务管理器提供了严格的保证,它要么提交所有资源,要么不提交任何资源。通过使用XA协议的2PC(两阶段提交)来实现这一点。由于保持资源同步的方法比较复杂,所以性能会有所降低。
相反,ChainedTransactionManager不使用2PC和XA,它更多地只是一种声明多个资源应该一起提交或回滚,并按特定(相反的)顺序进行的方式。与JTA事务管理器一样,它尝试一次性提交或回滚所有资源,但它并不保证所有资源都会被提交或回滚。但在特定情况下,这也是可以接受的。
假设在链式事务管理器中使用了两个资源:与JMS相关和与数据库相关,在事务期间,您首先从队列中读取消息,然后处理涉及数据库的某些业务逻辑,最后同时提交两个资源。如果首先提交数据库,其次提交JMS,则可能发生数据库提交但是JMS回滚的情况。在这种情况下,初始消息将留在消息队列中,这并不完全可行,并且可能会导致重复的消息处理(因为消息已经被处理并导致成功的数据库提交)。但是,如果您的业务逻辑已准备好处理此类情况,则可以处理该情况-当然,代价是编写额外的代码。但如果性能更重要,则使用ChainedTransactionManager应该比JTA性能更快。
注意:使用ChainedTransactionManager时,事务管理器的顺序很重要:最有可能中断事务的事务管理器应该在配置的列表中排在最后面。
总之,如果您可以安全地处理一种资源提交而另一种资源回滚的情况,或者这种情况很少发生,以至于您可以忽略它,那么您可以首先尝试使用ChainedTransactionManager。如果性能不是非常重要和/或您想确保多个资源完全同步,则可能应该使用JTA。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接