我试图在我的Spring应用程序中的方法中引入悲观锁定,但没有成功。我使用Spring和Hibernate,使用MySQL db 我有这种控制器方法:
@RequestMapping(value = "/sensoristica")
public ResponseEntity<Sensoristica> findIlluminazione(@RequestParam(value = "idLuce") int idLuce,
@RequestParam(value = "lit") boolean lit, @RequestParam(value = "suServer") boolean suServer) {
Luce luce = luceService.findById(idLuce);
int idInterruttore = luce.getInterruttore().getIdInterruttore();
if (luce.isAttivo()) {
int timeout = luce.getTimeout();
Date date = new Date();
Date dateTime = new Timestamp(date.getTime());
// aggiorniamo lo stato del sensore
luce.setDateTime(dateTime);
luce.setLit(lit);
if (lit) {
Interruttore interruttore = interruttoreService.findById(idInterruttore);
interruttoreService.pushTimeout(interruttore, timeout);
}
} else {
logger.debug("Sensore " + idLuce + " non attivo");
luce.setLit(false);
}
luceService.updateLuce(luce);
return new ResponseEntity<Sensoristica>(sensoristica, HttpStatus.OK);
}
pushTimeout(interruttore, timeout)
位于服务类中,它是
@Override
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void pushTimeout(Interruttore interruttore, int timeout) {
try {
Date nextTimeout = interruttore.getTimeoutDate();
DateTime dt = new DateTime();
Date richiesta = dt.plusMinutes(timeout).toDate();
DateTimeComparator comparator = DateTimeComparator.getInstance(DateTimeFieldType.secondOfMinute());
int toUpdate = comparator.compare(nextTimeout, richiesta);
if (toUpdate < 0) {
interruttore.setTimeoutDate(richiesta);
updateInterruttore(interruttore);
logger.debug("new Timeout: " + richiesta);
} else {
logger.debug("Timeout previous or equal, don't update");
}
} catch (PessimisticLockingFailureException pe){
logger.error("Pessimistic lock error", pe);
}
}
当多个请求到达我的控制器时,我希望只有第一个请求到达pushTimeout
而另一个请求异常,但它不是......例如,查看日志:
2016-11-04 19:03:57 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:57 CET 2016
2016-11-04 19:03:58 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:58 CET 2016
2016-11-04 19:03:58 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:58 CET 2016
2016-11-04 19:03:58 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:58 CET 2016
2016-11-04 19:03:58 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:58 CET 2016
2016-11-04 19:03:58 DEBUG InterruttoreServiceImpl:136 - new Timeout: Fri Nov 04 19:04:58 CET 2016