先看两个案例
@Servicepublic class OrderServiceImpl implements OrderService {public void update(Order order) {updateOrder(order);}@Transactionalpublic void updateOrder(Order order) {// update order}}
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
