潞城网站建设公司,学校做网站一般多少钱,设计师论坛,全免费的传奇手游Transactional 背景#xff1a;在某些情况下#xff0c;我们需要分段transaction#xff0c;在最外面没有transaction#xff0c;里面分成几个transaction#xff0c;保证分段是成功的。 问题代码#xff1a; Service public Order getOrder1(String id) {OptionalOr…Transactional 背景在某些情况下我们需要分段transaction在最外面没有transaction里面分成几个transaction保证分段是成功的。 问题代码 Service
public Order getOrder1(String id) {OptionalOrder 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) {OptionalOrder 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) {OptionalOrder 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;});}