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是在调用事务方法中实际进入的入口:

  1. 根据当前注解内容,选择事务管理器(PlatformTransactionManager)
  2. 会根据当前线程事务状态,是创建新事务还是使用已有事务。
上一篇:C++ 动态分配 和 内存分配和内存释放


下一篇:linux xml