Spring事务源码(1)-TransactionInterceptor

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring事务源码(1)-TransactionInterceptor相关的知识,希望对你有一定的参考价值。

参考技术A 事务执行过程

如图:a b 两个对象分别都是用了@Transactional注解开启声明式事务
问题一:如果 b 方法自己捕获了异常,那 ab 事务会提交吗?
问题二:如果 a 方法对b方法捕获异常 那 ab 事务会提交吗?
问题三:如果把条件改成 @Transactional(propagation = Propagation.REQUIRES_NEW) 呢?重复上面一 ,二 问题

TransactionAspectSupport

completeTransactionAfterThrowing
处理一个可抛出的,完成事务。
我们可以提交或回滚,这取决于配置。

txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());
AbstractPlatformTransactionManager.rollback 方法

processRollback(defStatus, false);
回滚的处理方法 提交的方法里面也有调用到 先mark

AbstractPlatformTransactionManager.commit方法

判断异常类型
txInfo.transactionAttribute.rollbackOn(ex)

spring源码学习spring的事务管理源码学习

一、抽象概念

1、事务管理器

接口:org.springframework.transaction.PlatformTransactionManager

实现类:org.springframework.jdbc.datasource.DataSourceTransactionManager

2、事务定义和配置

事务定义接口:org.springframework.transaction.TransactionDefinition

事务配置接口:org.springframework.transaction.interceptor.TransactionAttribute

接口实现类:org.springframework.transaction.interceptor.RuleBasedTransactionAttribute

3、事务配置源

接口:org.springframework.transaction.interceptor.TransactionAttributeSource

接口实现类:org.springframework.transaction.annotation.AnnotationTransactionAttributeSource

4、事务增强器

实现:org.springframework.transaction.interceptor.TransactionInterceptor (Advice接口实现)

5、事务切面管理

切面:org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor(Advisor的接口实现)

切点:org.springframework.transaction.interceptor.TransactionAttributeSourcePointcut(Pointcut的接口实现)

类过滤器:org.springframework.aop.TrueClassFilter(ClassFilter接口实现)

方法过滤器:org.springframework.transaction.interceptor.TransactionAttributeSourcePointcut(MethodMatcher的接口实现)

增强:org.springframework.transaction.interceptor.TransactionInterceptor (Advice接口实现)

 

二、事务传播机制

事务传播行为类型

说明

PROPAGATION_REQUIRED

如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS

支持当前事务,如果当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,如果当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,如果当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

 

事务拦截器-创建事务(事务传播机制的流程图)

以上是关于Spring事务源码(1)-TransactionInterceptor的主要内容,如果未能解决你的问题,请参考以下文章

spring源码学习spring的事务管理源码学习

MyBatis 源码篇-Transaction

老王读Spring Transaction-3TransactionDefinition原理和源码解析

Spring Transaction源码分析

Spring Transaction + MyBatis SqlSession事务管理机制研究学习

spring事务源码解析