我试图了解我是否在做正确的交易。我在 Spring Boot 上使用 PostgreSQL 构建了一个小型 REST API。
案例是“保留” - 传入请求应该找到某个实体并将其状态设置为“保留”。必须防止的是两个请求返回同一个实体。
目前我将整个端点处理程序包装在一个事务中(如下)。据我了解,系统基本上会对当前状态进行快照,然后第一个请求将修改表。
问题是,当第二个请求进来时,在第一个仍然在事务内时,会发生什么?我需要 find() 查询将等到第一个事务结束然后继续。至少在理论上,它会像这样工作吗?
@Transactional
@RequestMapping(value = "/newTour", method = RequestMethod.GET, headers = "Accept=application/xml",
consumes = "application/xml", produces = "application/xml")
public @ResponseBody ResponseEntity<?> addTourReservation(@RequestBody PartialTourUpdate partialUpdate) {
try{
List<Tour> tours = tourRepo.findFirstPessimisticByTourTypeInAndStatusOrderByPriorityDesc(partialUpdate.getTourType(), Tour.STATUS_OPEN);
if (tours != null && tours.size() > 0) {
Tour tour = tours.get(0);
tour.setReservationID(partialUpdate.getReservationID());
tour.setStatus(Tour.STATUS_TO_RESERVE);
tourRepo.save(tour);
orderRepo.updateReservationStatus(true, tour.getTourID());
return new ResponseEntity<Tour>(tour, HttpStatus.CREATED);
} else {
rM.setValue(ResultMessage.ErrorCode.LOS_NOT_FOUND);
rM.log();
return new ResponseEntity<ResultMessage>(rM, HttpStatus.OK);
}
} catch (Exception e)
{
rM.setValue(ResultMessage.ErrorCode.LOS_UNKNOWN);
rM.log();
return new ResponseEntity<ResultMessage>(rM, HttpStatus.OK);
}
月关宝盒
相关分类