《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

1.Spring与事务处理

有了Spring事务管理的支持,只需要通过一些简单的配置,应用就能完成复杂的事务处理工作,从而为用户使用事务处理提供很大的方便。

2.Spring事务处理的设计概览

Spring事务处理模块中的类层次结构

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

在Spring事务处理中,可以通过设计一个TransactionProxyFactoryBean来使用AOP功能,通过这个TransactionProxyFactoryBean可以生成Proxy代理对象,在这个代理对象中,通过TransactionInterceptor来完成对代理方法的拦截,正是这些AOP拦截功能,将事务处理的功能编织进来。在Spring事务处理中,在实现声明式事务处理时,这是AOP和IOC模块集成的部分。在Spring事务处理中,对主要的事务实现做了一个抽象和适配。适配的具体事务处理器包括:对DataSource数据源的事务处理支持,对Hibernate数据源的事务处理支持,对JDO数据源的事务处理支持,对JPA和JTA等数据源的事务处理支持。这一系列事务处理支持,都是通过设计PlatformTransactionManager、AbstractPlatforTransactionManager以及一系列具体事务处理器来实现,而PlatformTransactionManager又实现了TransactionInterceptor接口,通过这样一个接口实现设计,就把这一系列的事务处理的实现与前面提到的TransactionProxyFactoryBean结合起来,从而形成了一个Spring声明式事务处理的设计体系。

3.Spring事务处理的应用场景

Spring为常用的数据源的事务处理支持提供一系列的TransactionManager。

4.Spring声明式事务处理

4.1设计原理和基本过程

声明式事务处理的步骤:

  • 读取和处理在IOC容器中配置的事务处理属性,并转换为Spring事务处理需要的内部数据结构。
  • Spring事务处理模块实现统一的事务处理过程。这个通用的事务处理过程包含处理事务配置属性,以及与线程绑定完成事务处理的过程,Spring通过TransactionInfo和TransactionStatus这两个数据对象,在事务处理过程中记录和传递相关执行场景。
  • 底层的事务处理实现。对于底层的事务操作,Spring委托给具体的事务处理器来完成,这些具体的事务处理器,就是在IOC容器中配置声明式事务处理时,配置的platformTransactionManager的具体实现,比如DataSourceTransactionManager和HibernateTransactionManager等。

4.2实现分析

1.事务处理拦截器的配置

建立事务处理对象的时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

在建立TransactionProxyFactoryBeans的事务处理拦截器的时候,首先需要对ProxyFactory对象,从而实现AOP的使用。

2.事务处理配置的读入

这个为事务处理服务的TransactionAttributeSourcePointcut的matches方法实现中,首先把事务方法的属性配置读取到TransactionAttributeSource对象中,有了这些事务处理的配置以后,根据当前方法调用的Method对象和目标对象,对是否需要启动事务处理拦截器进行判断。

3.事务处理拦截器的设计与实现

事务提交的时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

在这个invoke()方法的实现中,可以看到整个事务处理在AOP拦截器中实现的全过程。同时,它也是spring采用AOP封装事务处理和实现声明式处理的核心部分。

5.Spring事务处理的设计和实现

5.1Spring事务处理的编程式使用

这个编程式使用事务管理的过程中,没有看到框架特性的使用,非常简单和直接,很好地说明了事务管理的基本实现过程,以及在Spring事务处理实现中涉及一些主要的类,比如TransactionStatus、TransactionManager等,对这些类的使用与声明式事务处理的最终实现是一样的。

5.2事务的创建

作为声明式事务处理实现的起始点,需要注意TransactionInterceptor拦截器的invoke回调中使用的createTransactionIfNecessary方法,这个方法是在TransactionInterceptor的基类TransactionAspectSupport中实现的。

调用createTransactionIfNecessary的时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

5.3事务的挂起

5.4事务的提交

5.5事务的回滚

6.Spring的事务处理器的设计与实现

6.1Spring事务处理的应用场景

Spring事务管理器的类设计

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

6.2DataSourceTransactionManager的实现

如果使用DataSource创建事务,最终通过设置Connection的AutoCommit属性来对事务处理进行配置。

实现DataSourceTransactionManager的时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)

使用DataSourceTransactionManager实现事务创建、提交和回滚的过程,基本上与单独使用Connection实现事务处理是一样的,也是通过设置autoCommit属性,调用Connection的commit和rollback方法来完成的。

6.3HibernateTransactionManager的实现

HibernateTransactionManager实现事务处理的时序图

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之六(Spring事务处理的实现)