spring对我们的service组件创建了一个动态代理,你加了@Transactional注解之后,就对这个动态代理插入了事务管理的增强逻辑,开始执行方法之前先开启事务,方法中有报错就回滚事务,如果没有报错就提提交事务。如下图:
我们可以基于AOP先来模拟下@Transactional的效果,其实AOP的本质就是动态代理,而动态代理说白了就是一种代理模式,通过代理模式我们可以额外添加一些增强逻辑。因此我们可以利用代理类中的增强逻辑来实现@Transactional注解的效果,那么这个是什么意思呢?我们可以这样做,看下边这张图:
通过上边的图,我们可以看到,FlowRechargeCenterService.finishRefillData调用代理类方法时,代理类首先会开启一个事务,然后再执行目标类的方法,当目标类方法执行结束之后,再来看下此时是否发生异常,如果发生了异常,那么就直接回滚事务,而如果没有发生异常,那么就提交事务。而上图中的开启事务、提交事务和回滚事务操作,其实都是AOP中的增强逻辑。其实,我们平时使用事务时,也是这样的逻辑,就是正常执行完毕后提交事务,而如果有异常就回滚事务。那上图中的逻辑该怎么来落地实现呢?我们要做的,就是在目标类的前后加一些增强逻辑蛮,AOP是提供了五种增强的,我们直接在AOP的五种增强中,来
分布式事务实战八(Spring事务框架源码初探之基于AOP思想与动态代理无缝插入事务支持)
于 2022-04-10 14:41:59 首次发布