Spring实现事务的方式分为编程式和声明式,其中声明式是最为常见的,声明式事务的实现又分为XML配置文件、@Transactional注解两种实现方式,SpringBoot因为取消了XML配置文件的书写,所以SpringBoot中的事务主要是使用@Transactional注解来实现的,下面从源码角度分析其原理
已知@Transactional事务实现的原理是基于AOP来实现的,在之前的博客中详细讲解了AOP的实现原理:动态代理+拦截链,由此可以大概推测出@Transactional的实现逻辑:Spring有一个针对@Transactional的增强器(拦截器)Interceptor,在bean实例初始化的最后一步会调用带该拦截器的拦截器链增强@Transactional注解的方法,并且生成代理类
TransactionInterceptor拦截器
关于拦截器链如何形成并且执行的,这里不做赘述,这里主要关注针对@Transactional注解的拦截器
TransactionInterceptor,和别的拦截器一样,他也有invoke方法
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
............
@Override
public Object invoke(final MethodInvocation invocation)