spring事务实现原理
实现原理
本质
如果你用过Spring AOP,那么理解注解事务就十分简单了。事务注解本质上实在事务方法加入一个Around切面,在方法开始前开始事务,在抛出异常后回滚事务。使用简单伪代码可以简单理解为
doWithTransaction(...){
try{
startTransaction();//开启事务
originMehod();//原始方法调用
commit();//事务提交
}catch(exception ex){
rollback()//事务回滚
}
}
事务传播性
Spring transaction有各种事务传播性,归根到底就是当前是新开事务还是使用已有事务(或者是抛异常)。其实很简单,使用一个ThreadLocal来记录下当前事务状态(是否在事务中),改造一下上面的方法
doWithTransaction(...){
Transaction transaction= getFromThreadLocal();
Transaction curTransaction;
if(如果不存在事务){
curTransaction = newTransaction()
curTransaction.startTransaction();//开启事务
try{
originMehod();//原始方法调用
}catch(exception ex){
curTransaction.rollback()//事务回滚
throw ex
}
curTransaction.commit();//事务提交
}else{
if(不支持当前事务){
oldTransaction = transaction
oldTransaction.suspend()//当前事务挂起
curTransaction = newTransaction();
curTransaction.startTransaction();//开启事务
try{
originMehod();//原始方法调用
} catch(exception ex){
curTransaction.rollback()//事务回滚
throw ex
}
curTransaction.commit();//事务提交
oldTransaction.resume()
}else{
//复用已有事务
originMehod();//原始方法调用
}
}
}
指定事务回滚异常
其实就再catch住异常以后,判断下当前异常是否需要回滚。
try{
originMehod();//原始方法调用
} catch(exception ex){
if(事务满足回滚){
curTransaction.rollback()//事务回滚
}
throw ex
}
上面伪代码虽然简单,但spring注解事务的基本原理基本就是这样
源码阅读相关类
事务管理类
PlatformTransactionManager(及其抽象AbstractPlatformTransactionManager),其实是TransactionInterceptor中的一个重要属性,主要功能是,创建一个事务,提交事务,回滚事务等操作。我们再配置spring的时候都会创建,例如常见的DataSourceTransactionManager,。
AOP切面类
TransactionInterceptor(及其父类TransactionAspectSupport)保存类当前线程的事务状态,TransactionInterceptor是在调用事务方法中实际进入的入口:
- 根据当前注解内容,选择事务管理器(PlatformTransactionManager)
- 会根据当前线程事务状态,是创建新事务还是使用已有事务。
spring事务实现原理的更多相关文章
- Spring 事务管理原理探究
此处先粘贴出Spring事务需要的配置内容: 1.Spring事务管理器的配置文件: 2.一个普通的JPA框架(此处是mybatis)的配置文件: <bean id="sqlSessi ...
- 关于Spring事务的原理,以及在事务内开启线程,连接池耗尽问题.
主要以结果为导向解释Spring 事务原理,连接池的消耗,以及事务内开启事务线程要注意的问题. Spring 事务原理这里不多说,网上一搜一大堆,也就是基于AOP配合ThreadLocal实现. 这里 ...
- spring 事务 @EnableTransactionManagement原理
@EnableXXX原理:注解上有个XXXRegistrar,或通过XXXSelector引入XXXRegistrar,XXXRegistrar实现了 ImportBeanDefinitionRegi ...
- 通俗的讲法理解spring的事务实现原理
拿房屋买卖举例,流程:销售房屋 -- 接待员 -- 销售员 -- 财务 售楼处 存放着所有待售和已售的房屋数据(数据源 datasource) 总经理 带领一套自己的班底,下属员工都听自己的,服务于售 ...
- Spring事务实现分析
一.Spring声明式事务用法 1.在spring配置文件中配置事务管理器 <bean id="baseDataSource" class="com.alibaba ...
- Spring事务的5种隔离级别和7种传播性
隔离级别 isolation,5 种: ISOLATION_DEFAULT,ISOLATION_READ_UNCOMMITTED,ISOLATION_READ_COMMITTED,ISOLATION_ ...
- Spring事务源码分析总结
Spring事务是我们日常工作中经常使用的一项技术,Spring提供了编程.注解.aop切面三种方式供我们使用Spring事务,其中编程式事务因为对代码入侵较大所以不被推荐使用,注解和aop切面的方式 ...
- Spring源码剖析9:Spring事务源码剖析
转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提 ...
- 这一次搞懂Spring事务注解的解析
前言 事务我们都知道是什么,而Spring事务就是在数据库之上利用AOP提供声明式事务和编程式事务帮助我们简化开发,解耦业务逻辑和系统逻辑.但是Spring事务原理是怎样?事务在方法间是如何传播的?为 ...
随机推荐
- LM && NTLM && ophcrack && RainBow table
Windows密码的加密方式:Windows 主要使用以下两种(包含但不限于)算法对用户名和密码进行加密:分 别是LanManager(LM)和NTLM,LM只能存储小于等于14个字符的密码hash, ...
- Android学习笔记(11):线性布局LinearLayout
线性布局LinearLayout是指在横向或是竖向一个接一个地排列.当排列的组件超出屏幕后,超出的组件将不会再显示出来. LinearLayout支持的XML属性和相应方法如表所看到的: Attrib ...
- 关于FMDatabase executeQuery的问题
如果你碰到这个问题,请查看idx的值,并查看SQL语句中第6个字段的值有问题(从0开始),比如你给的值是NSInteger会报错,需要将其转成NSString.
- UICollectionView在初始化的时候移动到某个距离
#pragma mark -- 使用场景:选中非第一张图片用CollectionView进行浏览时,CollectionView滑动到对应的位置 #pragma mark -- 重点在于UICol ...
- 手机APP UI设计尺寸基础知识
从原理开始介绍一下移动端设计尺寸规范 初涉移动端设计和开发的同学们,基本都会在尺寸问题上纠结好一阵子才能摸到头绪.我也花了很长时间才弄明白,感觉有必要写一篇足够通俗易懂的教程来帮助大家.从原理说起,理 ...
- Disruptor学习笔记
前言 以前一直听说有Disruptor这个东西,都说性能很强大,所以这几天自己也看了一下. 下面是自己的学习笔记,另外推荐几篇自己看到写的比较好的博客: Disruptor——一种可替代有界队列完成并 ...
- javascript es6 箭头函数
1.箭头函数示例 let add = (a,b) => a + b //没有语句块时,默认作为返回值 add(1,2); var multi = (a,b) => {ret ...
- 判断一棵二叉树是否为AVL树
思路:AVL树是高度平衡的二叉搜索树,这里为了清晰说明,分别判断是否为搜索树,是否为平衡树. struct TreeNode { struct TreeNode *left; struct TreeN ...
- Badboy教程
Badboy教程 摘自:Badboy-系列教程-资料整理 2016-11-30 1 界面介绍 2 录制 3 创建suites,tests,steps和Template 4 运行脚本 5 参数化 Add ...
- java中自定义注释@interface的用法
一.什么是注释 说起注释,得先提一提什么是元数据(metadata).所谓元数据就是数据的数据.也就是说,元数据是描述数据的.就象数据表中的字段一样,每个字段描述了这个字段下的数据的含义.而J ...