第19章 Spring事务王国的架构(三)

第19章 Spring事务王国的架构

19.2 和平年代

19.2.2 TransactionStatus

org.springframework.transaction.TransactionStatus接口定义表示整个事务处理过程中的事务状态,更多时候,我们将在编程式事务中使用该接口。

在事务处理过程中,我们可以使用TransactionStatus进行如下工作。

  • 使用TransactionStatus提供的相应方法查询事务状态。

  • 通过setRollbackOnly()方法标记当前事务以使其回滚。

  • 如果相应的PlatformTransactionManager支持Savepoint,可以通过TransactionStatus在当前事务中创建内部嵌套事务

在稍后将为你介绍如何使用Spring进行编程式事务管理的部分,可以更直观地了解这些。TransactionStatus的实现层次比较简单,见图19-9。

image-20220610145045687

org.springframework.transaction.SavepointManager是在JDBC3.0的基础上,对Savepoint的支持提供的抽象。通过继承SavepointManager,TransactionStatus获得可以管理Savepoint的能力,从而支持创建内部嵌套事务。

org.springframework.transaction.support.AbstractTransactionStatus是TransactionStatus的抽象类实现,主要为其他实现子类提供一些“公共设施”。它下面主要有两个子类,DefaultTransactionStatus和SimpleTransactionStatus。其中,DefaultTransactionStatus是Spring事务框架内部使用的主要TransactionStatus实现类。**Spring事务框架内的各个TransactionManager的实现,大都借助于DefaultTransactionStatus来记载事务状态信息。**SimpleTransactionStatus在Spring框架内部的实现中没有使用到,目前来看,主要用于测试目的。

19.2.3 PlatformTransactionManager

PlatformTransactionManager是Spring事务抽象框架的核心组件,我们之前已经提过了它的定义以及作用,所以,这里我们将更多地关注整个PlatformTransactionManager的层次体系,以及针对不同数据访问技术的实现类。

PlatformTransactionManager的整个抽象体系基于**Strategy模式,由PlatformTransactionManager对事务界定进行统一抽象,而具体的界定策略的实现则交由具体的实现类。**下面我们先来看一下有哪些可供我们使用的实现类。

1. PlatformTransactionManager实现类概览

PlatformTransactionManager的实现类可以划分为面向局部事务和面向全局事务两个分支。

面向局部事务的platformTransactionManager实现类。 Spring为各种数据访问技术提供了现成的PlatformTransactionManager实现支持。表19-1给出了各种数据访问技术与它们对应的实现类的关系。

image-20220610174834637

在这些实现类中,CciLocalTransactionManager可能是比较少见的实现,CCI是Common Client Interface的缩写。CciLocalTransactionManager主要是面向JCA的局部事务,本书不打算对JCA的集成做过多的阐述。如果你在实际项目中需要使用到JCA进行EIS(Enterprise Information System)系统集成,那么可以从Spring的参考文档获得使用Spring提供的JCA集成支持的相关信息。

有了这些实现类,我们在使用Spring的事务抽象框架进行事务管理的时候,只需要根据当前使用的数据访问技术,选择对应的PlatformTransactionManager实现类即可。

提示:如果我们的应用程序需要同时使用Hibernate以及JDBC(或者iBATIS)进行数据访问,那么可以使用HibernateTransactionManager对基于Hibermate和JDBC(或者iBATIS)的事务进行统一管理,只要Hibernate的SessionFactory和JDBC(或者iBATIS)引用的是同一个DataSource就行。能猜到为什么吗?

面向全局事务的PlatformTransactionManager实现类。org.springframework.transaction.jta.JtaTransactionManager是Spring提供的支持分布式事务的PlatformTransactionManager实现。直接使用JTA规范接口进行分布式事务管理有以下几个问题。

  • UserTransaction接口使用复杂不说(一长串的异常处理我们之前也见过了),它所公开的事务管理能力有限,对于事务的挂起(Suspend)以及恢复(Resume)操作,只有JTA的TransactionManager才支持。
  • JTA规范并没有明确要求对TransactionManager的支持,这就造成虽然当下各个JITA提供商提供了TransactionManager的实现,但在应用服务器中公开的位置各有差异。为了进一步支持REQUIRES_NEW和NOT_SUPPORTED之类需要事务挂起以及恢复操作的事务传播行为,我们需要通过不同的方式来获取不同JTA提供商公开的TransactionManager实现。

鉴于此,JtaTransactionManager对各种JTA实现提供的分布式事务支持进行了统一封装,只不过它的所有的事务管理操作,最终都会委派给具体的JTA实现来完成。

对于典型的基于JTA的分布式事务管理,我们直接使用JtaTransactionManager就可以了。但某些时候,如果需要使用到各JTA产品的TransactionManager的特性,我们就可以为JtaTransactionManager注入这些JTA产品的javax.transaction.TransactionManager的实现。而至于说我们是通过应用服务器获取该TransactionManager,还是直接使用本地定义的TransactionManager(比如JOTM或者Atomikos等独立JTA实现产品的TransactionManager),则需要完全根据当时的场景来决定了。能够为JtaTransactionManager提供具体的TransactionManager实现,为我们扩展JtaTransactionManager提供了很好的一个切入点。

JtaTransactionManager有两个子类OC4JJtaTransactionManagerWebLogicJtaTransactionManager,分别面向基于Oracle0C4J和Weglogic的JTA分布式事务管理。在这些情况下,需要使用具体的子类来代替通常的JtaTransactionManager。不过,大多数情况下,使用Spring提供的FactoryBean机制来获取不同JTA提供商提供的TransactionManager实现,然后注入JtaTransactionManager使用,是比较好的做法。org.springframework.transaction.jta包下,Spring提供了面向JOTM、Weblogic和Websphere的TransactionManager查找FactoryBean实现。如果需要,我们也可以根据情况,实现并给出其他的TransactionManager实现对应的用于查找的FactoryBean。

有了Spring的事务抽象框架,事务管理策略的转换也变得很简单,通常也只是简单的配置文件变更而已。 如果我们最初只需要处理单一资源的事务管理,那么局部场景中的面向不同数据访问技术的PlatformTransactionManager实现,将是我们的最佳选择。即使后来需要引入分布式资源的事务管理,对于我们来说,也只是从局部事务场景中的某个PlatformTransactionManager实现转向JtaTransactionManager的变动而已。无论是编程式注入还是通过Spring的IoC容器注入,对于应用程序来说都不会造成很大的冲击。

猜你喜欢

转载自blog.csdn.net/qq_34626094/article/details/125358077