You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
source-code-hunter/docs/Spring/SpringTransaction/Spring与事务处理.md

4.8 KiB

JavaEE应用中的事务处理是一个重要并且涉及范围很广的领域。事务管理的实现往往涉及并发和数据一致性方面的问题。作为应用平台的Spring具有在多种环境中配置和使用事务处理的能力也就是说通过使用Spring的事务组件可以把事务处理的工作统一起来并为事务处理提供通用的支持。

在涉及单个数据库局部事务的事务处理中事务的最终实现和数据库的支持是紧密相关的。对局部数据库事务来说一个事务处理的操作单元往往对应着一系列的数据库操作。数据库产品对这些数据库的SQL操作已经提供了原子性的支持对SQL操作而言,它的操作结果有两种: 一种是提交成功,数据库操作成功;另一种是回滚,数据库操作不成功,恢复到操作以前的状态。

在事务处理中事务处理单元的设计与相应的业务逻辑设计有很紧密的联系。在很多情况下一个业务逻辑处理不会只有一个单独的数据库操作而是有一组数据库操作。在这个处理过程中首先涉及的是事务处理单元划分的问题Spring借助IoC容器的强大配置能力为应用提供了声明式的事务划分方式这种声明式的事务处理为Spring应用使用事务管理提供了统一的方式。有了Spring事务管理的支持只需要通过一些简单的配置应用就能完成复杂的事务处理工作从而为用户使用事务处理提供很大的方便。

1 Spring事务处理的设计概览

Spring事务处理模块的类层次结构如下图所示。

avatar

从上图可以看到Spring事务处理模块是通过AOP功能来实现声明式事务处理的比如事务属性的配置和读取事务对象的抽象等。因此在Spring事务处理中可以通过设计一个TransactionProxyFactoryBean来使用AOP功能通过这个TransactionProxyFactoryBean可以生成Proxy代理对象在这个代理对象中通过TransactionInterceptor来完成对代理方法的拦截正是这些AOP的拦截功能将事务处理的功能编织进来。

对于具体的事务处理实现比如事务的生成、提交、回滚、挂起等由于不同的底层数据库有不同的支持方式因此在Spring事务处理中对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括对DataSource数据源的事务处理支持对Hibernate数据源的事务处理支持对JDO数据源的事务处理支持对JPA和JTA等数据源的事务处理支持等。这一系列的事务处理支持都是通过设计PlatformTransactionManager、AbstractPlatforTransactionManager以及一系列具体事务处理器来实现的而PlatformTransactionManager又实现了TransactionInterceptor接口通过这样一个接口实现设计就把这一系列的事务处理的实现与前面提到的TransactionProxyFactoryBean结合起来从而形成了一个Spring声明式事务处理的设计体系。

2 Spring事务处理的应用场景

Spring作为应用平台或框架的设计出发点是支持POJO的开发这点在实现事务处理的时候也不例外。在Spring中它既支持编程式事务管理方式又支持声明式事务处理方式在使用Spring处理事务的时候声明式事务处理通常比编程式事务管理更方便些。

Spring对应用的支持一方面通过声明式事务处理将事务处理的过程和业务代码分离出来。这种声明方式实际上是通过AOP的方式来完成的。显然Spring已经把那些通用的事务处理过程抽象出来并通过AOP的方式进行封装然后用声明式的使用方式交付给客户使用。这样应用程序可以更简单地管理事务并且只需要关注事务的处理策略。另一方面应用在选择数据源时可能会采取不同的方案当以Spring作为平台时Spring在应用和具体的数据源之间搭建一个中间平台通过这个中间平台解耦应用和具体数据源之间的绑定并且Spring为常用的数据源的事务处理支持提供了一系列的TransactionManager。这些Spring封装好的TransactionManager为应用提供了很大的方便因为在这些具体事务处理过程中已经根据底层的实现封装好了事务处理的设置以及与特定数据源相关的特定事务处理过程这样应用在使用不同的数据源时可以做到事务处理的即开即用。这样的另一个好处是如果应用有其他的数据源事务处理需要Spring也提供了一种一致的方式。这种有机的事务过程抽象和具体的事务处理相结合的设计是我们在日常的开发中非常需要模仿学习的。