先看两个案例

  1. @Service
  2. public class OrderServiceImpl implements OrderService {
  3. public void update(Order order) {
  4. updateOrder(order);
  5. }
  6. @Transactional
  7. public void updateOrder(Order order) {
  8. // update order
  9. }
  10. }

update方法上面没有加 @Transactional 注解,调用有 @Transactional 注解的 updateOrder 方法,updateOrder 方法上的事务管用吗?

再来看下面这个例子:

@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
    }

}

这次在 update 方法上加了 @Transactional,updateOrder 加了 REQUIRES_NEW 新开启一个事务,那么新开的事务管用么?
这两个例子的答案是:不管用!

因为它们发生了自身调用,会调用该类自己的方法,而不会调用代理类的方法。默认只有在外部调用事务才会生效,这也是老生常谈的经典问题了。

解决办法

注入自己

@Service
public class OrderServiceImpl implements OrderService {
    @Resource
    private OrderServiceImpl OrderService;

    @Transactional
    public void update(Order order) {
        OrderService.updateOrder(order);
    }

    @Transactional
    public void updateOrder(Order order) {
        // update order
    }  
}

————————————————
版权声明:本文为CSDN博主「craywen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38893133/article/details/110819461