@Transactional
背景:在某些情况下,我们需要分段transaction,在最外面没有transaction,里面分成几个transaction,保证分段是成功的。
问题代码:
Service
public Order getOrder1(String id) {
Optional<Order> test = orderRepository.findById(id);
Order order = getOrder2(id);
return order;
}
@Transactional
public Order getOrder2(String id){
Order order = orderRepository.lock(id); // 通过PESSIMISTIC_WRITE锁住这行order 行锁
return order;
}
在这种写法下,controller调用service的getOrder1方法, getOrder2锁了order,但是由于aop, 认为getOrder1是没有transaction的,所以getOrder2方法的transaction不会生效。这种情况下getOrder2的lock是无效的。
正确方法
1.
在另外一个Service里面定义getOrder2 通过autowired的方式实现transaction生效。
Service1
public Order getOrder1(String id) {
Optional<Order> test = orderRepository.findById(id);
Order order = service2.getOrder2(id);
return order;
}
Service2文章来源:https://www.toymoban.com/news/detail-611280.html
@Transactional
public Order getOrder2(String id){
Order order = orderRepository.lockById(id); // 通过PESSIMISTIC_WRITE锁住这行order 行锁
return order;
}
显示定义一个transaction. 通过transactionTemplate的方式。文章来源地址https://www.toymoban.com/news/detail-611280.html
public Order getOrder1(String id) {
Optional<Order> test = orderRepository.findById(id);
Order order = getOrder2(id);
return order;
}
public Order getOrder2(String id){
return transactionTemplate.execute(s-> {
Order order = orderRepository.lockById(id); // 通过PESSIMISTIC_WRITE锁住这行order 行锁
return order;
}
);
}
到了这里,关于分段@Transactional 坑及失效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!