文档章节

Spring源码解析(一) Spring事务控制之Hibernate

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 759
阅读 29
收藏 0

本文将对Spring在整合Hibernate事务方面的源码作一下初步的解析,特别是Spring对线程、事务、Hibernate Session三者的绑定关系。(注:本文基于目前最新的Spring 3.1.2 RELEASE 版本的源码进行分析)本文原文链接 http://blog.csdn.net/bluishglc/article/details/7774131 转载请注明出处。


众所周知,Spring的事务控制是基于AOP来实现的,而AOP的实现又依赖于JDK的动态代理或者是aspectj,一般情况下,遵循“基于抽象编程”的教义,Service层和DAO层都以接口+实现类的方式提供,此时,Spring会使用动代理来实现AOP拦截,我们的分析也是基于这种拦截方式展开的。那么下面,我们就假设:一个声明了事务的方法(如某个Service的方法)被调用了,在调用时,该方法将被拦截,执行拦截的方法是:


org.springframework.aop.framework.JdkDynamicAopProxy.invoke(Object, Method, Object[])


该方法主要是把所要调用的目标方法和需要施加的操作(即AOP中的Interceptor/Advice)粘合成一个ReflectiveMethodInvocation实例去执行。ReflectiveMethodInvocation最终会调用

org.springframework.transaction.interceptor.TransactionInterceptor.invoke(MethodInvocation)


进行有关事务的操作。作为一个环绕切面,该方法主要负责在目标方法执行前开始一个事务,在方法执行结束后提交事务。




我们先来深入了解一下事务是如何创建的。从方法createTransactionIfNecessary()上可以看到,创建事务的主要方法是:


org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(TransactionDefinition)


作为抽象类的方法,getTransaction()只处理了一些通用性的检查和设置,实质性的创建事务和开启事务操作都是通过分别调用抽象方法:


org.springframework.transaction.support.AbstractPlatformTransactionManager.doGetTransaction()

org.springframework.transaction.support.AbstractPlatformTransactionManager.doBegin(Object,TransactionDefinition)


来完成的,也就是说这些关键性的工作必须由各具体事务管理器来实现,对于hibernate的事务管理器来说,获取事务对象的方法如下:




开始事务的方法如下:




以上是关于事务开始部分的代码,下面我们来看一下事务提交时的代码:
同样的,从方法commitTransactionAfterReturning()我们可以看出执行事务提交的方法主要通过回调
org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(DefaultTransactionStatus)
来实现的。



补充:

关于方法
org.springframework.transaction.support.TransactionSynchronizationManager.getResource(Object key)
如该方法的注释所说,它主要是通过给定的key找到对应的资源,特别之处是这些资源实例是绑定在线程上的,也就是spring保证一个线程上一个key对应一个资源实例,不同的线程上绑定的是不同的资源实例。对应到Hibernate上来说,key是sessionFactory,资源是sessionHolder!

近期其他博文:

数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量

数据库分库分表(sharding)系列(二) 全局主键生成策略

数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示


本文转载自:http://blog.csdn.net/bluishglc/article/details/7774131

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
关于MyBatis sqlSession的一点整理

原文地址:关于MyBatis sqlSession的一点整理 工作中,需要学习一下MyBatis sqlSession的产生过程,翻看了mybatis-spring的源码,阅读了一些mybatis的相关doc,对mybatis sqlSession有了一些...

Realfighter
2015/01/04
0
1
Maven搭建SpringMVC+Hibernate项目详解 【转】

今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这篇主要搭建SpringMVC4.1.4和Hiber...

梵蒂冈考虑过
2016/10/19
37
1
jdbc-jdbcTemplate-hibernate-jpa-springDataJpa系列(一)

1 需要解决的疑惑 目前jdbc、jdbcTemplate、hibernate、jpa、spring之间有或多或少的关系。在使用它们的时候有着各种各样的配置,初学者很容易分不清到底各自都做了什么事情,如果对自己要求...

乒乓狂魔
2015/04/21
0
12
Maven搭建SpringMVC+Hibernate项目详解

前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这篇主要搭建SpringMVC4.1.4和H...

Airship
2016/12/12
19
0
分析总结Spring管理Hibernate中Dao层访问数据库常用方式(附SSH的jar包)

上篇博客中已经讲解Spring配置数据源的常用的几种方式。接下来本篇博客继续讲解。配置完数据源,那Dao层是如何访问数据库呢? 基于最近的项目使用SSH2框架完成,分析总结Spring与Hibernate集...

晨曦之光
2012/08/22
588
0

没有更多内容

加载失败,请刷新页面

加载更多

微服务分布式事务实现

https://www.processon.com/view/link/5b2144d7e4b001a14d3d2d30

WALK_MAN
今天
2
0
《大漠烟尘》读书笔记及读后感文章3700字

《大漠烟尘》读书笔记及读后感文章3700字: 在这个浮躁的社会里,你有多久没有好好读完一本书了? 我们总觉得自己和别人不一样,所以当看到别人身上的问题时,很少有“反求诸己”,反思自己。...

原创小博客
今天
4
0
大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
今天
3
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
今天
3
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部