Spring事务失效之自身调用失效
Spring事务失效之自身调用失效
情景一:
@Service
public class OrderServiceImpl implements OrderService {
public void update(Order order) {
updateOrder(order);
}
@Transactional
public void updateOrder(Order order) {
// update order
}
}
情景二:
@Service
public class OrderServiceImpl implements OrderService {
@Transactional
public void update(Order order) {
updateOrder(order);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {
// update order
}
}
以上两中场景下,事务都不会生效,因为他们都发生了自身调用,即在一个代理对象中调用自身方法,在这种情况下就会产生,事务失效
,以及新事务未生效
的情况
Spring官方解释:
因为代理模式只拦截通过代理传入的外部方法调用,所以自调用事务是不生效的。
解决办法:
- 通过Bean容器重新获取Bean
SpringUtils.getBean(自身Bean.class).执行方法();
这样返回的就是一个新的代理对象
- 将调用的自身的方法单独抽取到另一个Bean中
参考链接:
如何在一个事务中开启另一个事务
事务失效场景
自身事务调用失效解决