Spring事务失效之自身调用失效

1657 3~4 min

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官方解释:
image.png
image.png

因为代理模式只拦截通过代理传入的外部方法调用,所以自调用事务是不生效的。

解决办法:

  1. 通过Bean容器重新获取Bean
SpringUtils.getBean(自身Bean.class).执行方法(); 
这样返回的就是一个新的代理对象
  1. 将调用的自身的方法单独抽取到另一个Bean中

参考链接:
如何在一个事务中开启另一个事务
事务失效场景
自身事务调用失效解决