实现原理
本质
如果你用过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事务原理是怎样?事务在方法间是如何传播的?为 ...
随机推荐
-
移动端App广告常见的10种形式
什么是App广告? App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别. App广告兴起得益于其载体—App的风行.平板电脑和大屏触 ...
-
控制HTML元素的显示与隐藏——display和visibility
有些时候我们需要根据某些条件来控制Web页面中的HTML元素显示还是隐藏,可以通过display或visibility来实现.通过下面的例子了解display和visibility的区别,简单的例子代 ...
-
IIS中访问自己开发的Webservice site就自动停止,尝试重启IIS和重启服务器都不能解决。
今天在加班的时候发现一个奇怪的问题,IIS里面我们自己开发的Webservice site一访问就自动停止.尝试重启IIS和重启服务器都不能解决.后台windows events报错信息是The Mo ...
-
SQL Server 服务器主体拥有一个或多个端点无法删除;错误15141
一.问题描述 当前数据库实例之前已经加入过一个域环境同时也是alwayson集群的一个副本,现在已经退出了以前的域加入一个新域,而且配置的数据库启动服务的域用户和密码和之前的一样.重新使用之前已经存在 ...
-
httpd2.4.6配置文件解释说明
本文httpd版本为:2.4.6 ServerRoot 先来看一下httpd.conf配置文件中的ServerRoot默认定义: # cat /etc/httpd/conf/httpd.conf |e ...
-
查询字符串(性能对比): Array Vs HashMap
ip字符串长度: 15 ip count: 25 time - array:16ms, 查询次数:25000time - map:15ms, 查询次数:25000 ip count: 42 time ...
-
Downloadftp
#!/bin/bash FILENAME=$ DSTDIR=$ FTPSRV=ip FTPUSER="user" FTPPWD="password" SRCDI ...
-
Alan Cox:单向链表中prev指针的妙用
之前发过一篇二级指针操作单向链表的例子,显示了C语言指针的灵活性,这次再探讨一个指针操作链表的例子,而且是一种完全不同的用法. 这个例子是linux-1.2.13网络协议栈里的,关于链表遍历& ...
-
使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求
使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; ...
-
vscode简洁的代码编辑器
微软去年tuichu的代码编辑神器,vscode很不辞哦,感受还不错.微软也破天荒地跨平台地支持... 支持多种语言 vscode(官方):code.visualstudio.com vscode中文 ...