Spring注解式事务失效的场景
今天面试遇到了这样一道题,有点紧张没想起来
先整理下以前记忆中遇到的
方法内自调用
标题可能说的比较笼统,spring在控制反转和依赖注入后,使用的其实是代理对象。举个例子
比如 controller 中有一个接口,
他收到请求需要调用 aService 中的 a 方法,a 方法本身没有事务注解
然后a方法内部又调用aService中的 b方法 ,b 方法是注解了事务,
这个时候如果b抛出了异常,按照期望,应该是事务回滚才对,但是实际上却失效了。
这个原因是因为,我们在controller中注入了 aService ,这个时候调用 方法 a的时候,实际用的是aService 的代理对象来调用的。然后在 a 内部调用了 b 的时候,其实用的是实际的 aService 对象,事务就会出现失效。
解决
这种情况可以将接口放到另外的一个类,然后在aService 中再注入这个新的类,然后再用代理对象去调用