Spring源码深度解析(六):Spring事务原理详解

前言

Spring事务实质上是利用了AOP的原理,对于AOP的原理请参考文章 Spring AOP原理及源码详解

正文

1、@EnableTransactionManagement工作原理

开启Spring事务本质上就是增加一个Advisor,我们使用注解@EnableTransactionManagement注解来开启Spring事务时,该注解就是往Spring容器中添加了两个Bean:
a) AutoProxyRegistrar
b) ProxyTransactionManagementConfiguration
AutoProxyRegistrar主要作用是往Spring容器中注册了1个InfrastructureAdvisorAutoProxyCreator类型的Bean,它继承了AbstractAdvisorAutoProxyCreator,所以这个类的主要作用就是开启自动代理,它是一个BeanPostProcessor后置处理器,会在Bean初始化后去寻找Advisor类型的Bean,并判断当前某个Bean是否有匹配的Advisor,有则进行动态代理产生一个代理对象。

ProxyTransactionManagementConfiguration是一个配置类,它定义了另外3个Bean:
a) BeanFactoryTransactionAttributeSourceAdvisor:是一个Advisor
b) AnnotationTransactionAttributeSource:相当于上面Advisor的Pointcut
c) TransactionInterceptor:相当于上面Advisor的Advice

AnnotationTransactionAttributeSource就是用来判断某个类或类方法上是否存在@Transactional注解。

TransactionInterceptor就是代理逻辑,当某个类或类方法上存在@Transactional注解时,就会产生一个代理对象作为Bean,代理对象最终会执行TransactionInterceptor的invoke()方法。

2、Spring事务执行原理

一个Bean对象在执行Bean创建的生命周期时,会经过后置处理器InfrastructureAdvisorAutoProxyCreator的初始化后方法,会判断当前Bean对象是否和BeanFactoryTransactionAttributeSourceAdvisor匹配,匹配逻辑为判断该Bean的类或类方法上是否存在@Transactional注解,如果存在则表示该Bean需要进行动态代理产生一个代理对象。

代理对象在执行方法时,会执行该Advisor中的TransactionInterceptor的invoke()方法,执行的基本流程是:
1、利用所配置的PlatformTransactionManager事务管理器新建一个数据库连接
2、修改数据库连接的autocommit为false
3、执行MethodInvocation.proceed()方法,也就是执行业务方法,其中就会执行sql
4、如果方法没有抛异常,则提交事务
5、如果抛了异常,则回滚事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值