同类中A方法未加@Transactional,B方法加@Transactional
A调用B,B的事务注解并未生效。
众所周知,事务是通过Aop动态代理实现的,当A方法不加@Transactional注解,代理链路都chian都是空,你还想用事务?
A.methodB于是变成了this.methodB,仅此而已,也就是和普通类中方法调用没差别
如下图,A方法加了事务注解,chain链路中就有事务拦截器,chain是通过 getInterceptorsAndDynamicInterceptionAdvice()方法获取,而有了chain链路,才能引导你执行到TransactionInterceptore中的invoke()方法,
另外,被Transactional标注的方法也是需要声明成public的,看源码,在spring对bean进行装载初始化的时候,会去检查Transactional注解所标注的方法是不是public。
为什么他会去检查这个?那是因为jdk代理只能针对接口,cglib代理针对于目标类生成代理子类,如果是private方法是不能被继承的,所以...