Spring事务管理的底层逻辑—源码解析

本文代码为spring 5.1.2

spring是如何控制事务的提交和回滚

加上@Transactional注解之后,Spring可以启到事务控制的功能了,再正式执行方法前它会做一些操作,我们来看看

首先进入CglibAopProxy.classintercept方法或者JdkDynamicAopProxy.classinvoke方法(继承接口方式),根据不同实现方法选择不同的动态代理类

CglibAopProxy.class

JdkDynamicAopProxy.class
此处动态代理具体是指目标对象的目标方法,可以debug Evaluate看出

进去之后我们来到 ReflectiveMethodInvocation.class然后一步一步往下走来到 invoke方法
进入 invoke方法来到 TransactionInterceptor.class
继续往下,进入 invokeWithinTransaction方法,来到 TransactionAspectSupport.classinvokeWithinTransaction方法, invocation.proceedWithInvocationspring事务是环绕通知
进入 createTransactionIfNecessary方法,如图
出现异常时进入 completeTransactionAfterThrowing方法,可以看到 rollback()
没有异常则继续往下commit

@Transactional 事务注解是如何产生作用的?

如上所说,事务最开始是先进入CglibAopProxy.classintercept方法或者JdkDynamicAopProxy.classinvoke方法,可以看出这2个类都是AOP增强类,所以@Transactional 事务注解才可以产生作用。

有哪些不同类型的事务

来到TransactionAspectSupport.classcreateTransactionIfNecessary方法

进入 tm.getTransaction(txAttr); 来到 AbstractPlatformTransactionManager.class
@Transactional注解代码如图所示
来看看如果存在事务,进入handleExistingTransaction方法,如图

简单时序图

  • 挂起:在新方法里面,不使用外部的事务环境
  • 嵌套事务:
  • 保存点:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值