Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JtaTransactionManager和ChainedTransactionManager之间的区别?_Java_Spring_Transactions_Spring Transactions - Fatal编程技术网

Java JtaTransactionManager和ChainedTransactionManager之间的区别?

Java JtaTransactionManager和ChainedTransactionManager之间的区别?,java,spring,transactions,spring-transactions,Java,Spring,Transactions,Spring Transactions,我需要管理应用程序中的多个资源,如jms和数据库 在查看可以管理多个资源的事务管理器时,我遇到了两个事务管理器JtaTransactionManager和ChainedTransactionManager,它们几乎声称可以管理多个资源 有人能解释一下它们的主要区别吗?我什么时候应该用哪一种 如文件所述: : PlatformTransactionManager实现,协调事务创建、提交和回滚到委托列表。使用此实现假定导致事务回滚的错误通常会在事务完成之前或在提交最内部的PlatformTransa

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

在查看可以管理多个资源的事务管理器时,我遇到了两个事务管理器JtaTransactionManagerChainedTransactionManager,它们几乎声称可以管理多个资源

有人能解释一下它们的主要区别吗?我什么时候应该用哪一种

如文件所述: :

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

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

:

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


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

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

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

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

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