Spring声明式事务源码深度解析

整体流程

事务是使用SpringAop的原理去实现的

  1. 开启@EnableTransactionManagement注解
  2. 引入TransactionManagementConfigurationSelector.class这个类
  3. 加载AutoProxyRegistrar.class,ProxyTransactionManagementConfiguration.class两个对象
  4. 注册 InfrastructureAdvisorAutoProxyCreator.class这个对象,它是BeanPostProcessor的子类,beanid是org.springframework.aop.config.internalAutoProxyCreator,Bean对象在初始化之后都会判断是否需要生成代理类对象(根据是否有加上@Transactional注解)
  5. 将ProxyTransactionManagementConfiguration配置类中的对象注册到ioc容器中,其中注册了TransactionInterceptor事务拦截器
  6. TransactionInterceptor是MethodInterceptor(Aop)的子类,也属于Aop中的一个链
  7. 当springAop链调用的时候,会执行到TransactionInterceptor的invoke方法

类图:
在这里插入图片描述

spring事务拦截器的方法
protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass,
			final InvocationCallback invocation) throws Throwable {

		// If the transaction attribute is null, the method is non-transactional.
		TransactionAttributeSource tas = getTransactionAttributeSource();
		final TransactionAttribute txAttr = (tas != null ? tas.getTransactionAttribute(method, targetClass) : null);
		final PlatformTransactionManager tm = determineTransactionManager(txAttr);
		final String joinpointIdentification = methodIdentification(method, targetClass, txAttr);

		if (txAttr == null || !(tm instanceof CallbackPreferringPlatformTransactionManager)) {
			// Standard transaction demarcation with getTransaction and commit/rollback calls.
			TransactionInfo txInfo = createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
			Object retVal = null;
			try {
				//执行目标方法
				retVal = invocation.proceedWithInvocation();
			}
			catch (Throwable ex) {
				// 如果有异常就会进行回滚操作
				completeTransactionAfterThrowing(txInfo, ex);
				throw ex;
			}
			finally {
				cleanupTransactionInfo(txInfo);
			}
			//没有异常就会提交事务
			commitTransactionAfterReturning(txInfo);
			return retVal;
		}

		
	}

事务失效

如果service 没有将异常抛出的时候,上面这个方法没有捕获到异常,就会正常的提交事务
参考:蚂蚁课堂

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值