@Transactional
背景:在某些情况下,我们需要分段transaction,在最外面没有transaction,里面分成几个transaction,保证分段是成功的。
问题代码:
Service
public Order getOrder1(String id) {Optional<Order> test = orderRepository.findById(id);Order order = getOrder2(id);return order;}@Transactionalpublic 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
@Transactionalpublic Order getOrder2(String id){Order order = orderRepository.lockById(id); // 通过PESSIMISTIC_WRITE锁住这行order 行锁 return order;}
显示定义一个transaction. 通过transactionTemplate的方式。
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;});}