类似下面这种构造
外层A是默认的事务(),内层B选择了REQUIRES_NEW,期待B的业务可以独立commit
但是结果是,只有A的业务完全结束了,B才能一起commit
这个和我对REQUIRES_NEW的理解不一样,有木有大佬教教我呜呜
@Service
public class A {
@Autowired
B b;
@Async
@Transactional
public void execute() {
//其他业务
b.method()
//其他业务
}
}
@Service
public class B {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void method() {
//...
}
}
破案了,
写一下我的debug流程
首先、在DataSourceTransactionManager的doCommit进行了断点,确认了只有一次commit
那就说明requires_new失效了
思考了一下springboot中事务失效的几大可能性
感觉还是代理的问题,
于是debug模式下仔细看了一下A类和B类2个bean
发现B类的bean的debug信息中没有springclibproxy字样,也就是说没有自动代理?
然后我注意到B类是一个比较特殊的类,在启动时其实有提示它不能自动代理↓
INFO o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - xxxxxxxx is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
很好验证你的想法,自己注入DataSourceTransactionManager事务管理器(或者debug事务管理器也是一样的道理),看docommit会执行几次,执行两次那就是默认场景,new会单独提交,执行一次那就是打破你的认知,事务传播下去了,两次没说好说的,一次那就要分享你的代码了,让大家开开眼,改了什么配置