注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小葫芦君(汉斯的博客)

博客迁移到新博客:https://blog.ssxingshou.com

 
 
 

日志

 
 
关于我

小小葫芦商城,为您提供高品质的商品,一流的产品,一流的包装服务,一流的物流服务,放心购买

spring声明性事务管理实现技术剖析  

2011-12-13 09:50:00|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本文章会通过连载的方式来深入了解和学习Spring相关核心技术和实现原理。包括SpringBean生命周期管理,声明性事务管理,AOP管理,注解应用实现,以及在其上面进行扩展的相关应用。

本篇技术文章将介绍Spring声明式事务管理实现技术细节的剖析。

首先看一下Spring基于XML方式的声明式事务配置方法。(基于注解的也是相同,下篇在介绍Spring注解应用扩展实现时,会再介绍基于注解的Spring声明式事务的实现细节)

首先配置 BeanNameAutoProxyCreator 实现基于Bean 名称规则匹配的AOP拦截

示例代码如下:


从上面的配置示例中,可以发现Spring的声明式事务由一个叫TransactionInterceptor AOP拦截器实现, 我们代码的整体分析过程也是从这个类开始

TransacionInterceptor的类描述如下,其实现了MethodInterceptor接口


代码主体逻辑都是invoke方法里

下面是invoke方法的主要逻辑说明

首先获得拦载的方法名和类名,根据在xml文件的匹配规则,找出事务的配置规则,创建TransactionAttribute对象(如事务的读写属性,传播属性,事务隔离级别等)

如果匹配事务规则,则调用 createTransactionIfNecessary方法创建事务

整理创建事务的过程,则会调用SpringPlatformTransactionManager的接口实现类,示例中配置的是HibernateTransactionManager

整理个事务创建过程中,会用到两个重要的对象,说明如下:

HibernateTransactionObject 保存事务状态(是否新事务,是否新的SessionHolder,以前对应的SessionHolder实例) SessionHolder则是用于保持Transaction对象实例,以及管理事务所需要相关信息如引用次数,是否只能回滚等。

TransactionSynchronizationManager 管理当前线程的事务运行情况,所有的事务传播嵌套处理都由它来控制管理,它会保存以下信息:

                        当前的事务名称 currentTransactionName

                        当前只读事务的状态 currentTransactionReadOnly

                        当前事务使用的隔离级别 currentTransactionIsolationLevel

                        当前同步控制TransactionSynchronization对象synchronizations

                        当前的ResourceHolder对象实列,保存连接对象resources

下面是创建事务的序列图


核心代码及说明如下:

在创建事务过程中,会检测之前有没有事务开启,如果有则会根据当前方法上设置的事务的传播信息来决定是否使用原来事务,还是挂起原来事务,或开启新的事务等。

AbstractPlatformTransactionManager.getTransaction方法


是否新开启事务最终会将该状态设置到HibernateTransactionObjectnewSession属性上。这样在嵌套的方法退出时,可以由这个属性来决定要不要真正的提交事务。

封装创建JDBC的事务代码如下:HibernateTransactionManager.doBegin()方法


事务的提交和回滚实现

事务提交 TransactionInterceptorcommitTransactionAfterReturning来实现

主要代码如下:AbstractPlatformTransactionManager#commit方法


事务回滚TransactionInterceptorcompleteTransactionAfterThrowing来实现

主要代码如下:AbstractPlatformTransactionManager#rollback方法


基本上Spring的声明式事务的基本实现原理都已经介绍完了,下面附上相关的源码文件列表:

TransactionInterceptor.java

HiberanteTransactionManager.java

AbstractPlatformTransactionManager.java

TransactionSynchronizationManager.java

SessionHolder.java

ConnectionHolder.java

TransactionStatus.java

  评论这张
 
阅读(1654)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018