前言:
本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括Spring的Bean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。
本篇技术文章将介绍Spring声明式事务管理实现技术细节的剖析。
首先看一下Spring基于XML方式的声明式事务配置方法。(基于注解的也是相同,下篇在介绍Spring注解应用扩展实现时,会再介绍基于注解的Spring声明式事务的实现细节)
首先配置 BeanNameAutoProxyCreator
实现基于Bean 名称规则匹配的AOP拦截
示例代码如下:
从上面的配置示例中,可以发现Spring的声明式事务由一个叫TransactionInterceptor 的AOP拦截器实现, 我们代码的整体分析过程也是从这个类开始
TransacionInterceptor的类描述如下,其实现了MethodInterceptor接口
代码主体逻辑都是invoke方法里
下面是invoke方法的主要逻辑说明
首先获得拦载的方法名和类名,根据在xml文件的匹配规则,找出事务的配置规则,创建TransactionAttribute对象(如事务的读写属性,传播属性,事务隔离级别等)
如果匹配事务规则,则调用 createTransactionIfNecessary方法创建事务
整理创建事务的过程,则会调用Spring的PlatformTransactionManager的接口实现类,示例中配置的是HibernateTransactionManager
整理个事务创建过程中,会用到两个重要的对象,说明如下:
HibernateTransactionObject 保存事务状态(是否新事务,是否新的SessionHolder,以前对应的SessionHolder实例) SessionHolder则是用于保持Transaction对象实例,以及管理事务所需要相关信息如引用次数,是否只能回滚等。
TransactionSynchronizationManager 管理当前线程的事务运行情况,所有的事务传播嵌套处理都由它来控制管理,它会保存以下信息:
当前的事务名称 currentTransactionName
当前只读事务的状态 currentTransactionReadOnly
当前事务使用的隔离级别 currentTransactionIsolationLevel
当前同步控制TransactionSynchronization对象synchronizations
当前的ResourceHolder对象实列,保存连接对象resources
下面是创建事务的序列图
核心代码及说明如下:
在创建事务过程中,会检测之前有没有事务开启,如果有则会根据当前方法上设置的事务的传播信息来决定是否使用原来事务,还是挂起原来事务,或开启新的事务等。
AbstractPlatformTransactionManager.getTransaction方法
是否新开启事务最终会将该状态设置到HibernateTransactionObject的newSession属性上。这样在嵌套的方法退出时,可以由这个属性来决定要不要真正的提交事务。
封装创建JDBC的事务代码如下:HibernateTransactionManager.doBegin()方法
事务的提交和回滚实现
事务提交 由TransactionInterceptor的commitTransactionAfterReturning来实现
主要代码如下:AbstractPlatformTransactionManager#commit方法
事务回滚由TransactionInterceptor的completeTransactionAfterThrowing来实现
主要代码如下:AbstractPlatformTransactionManager#rollback方法
基本上Spring的声明式事务的基本实现原理都已经介绍完了,下面附上相关的源码文件列表:
TransactionInterceptor.java
HiberanteTransactionManager.java
AbstractPlatformTransactionManager.java
TransactionSynchronizationManager.java
SessionHolder.java
ConnectionHolder.java
TransactionStatus.java
Good Luck!
Yours Mattthew!
posted on 2011-04-29 10:54
x.matthew 阅读(2173)
评论(1) 编辑 收藏