Spring - Pessimistic Lock实现

时间:2016-11-04 18:16:57

标签: mysql spring hibernate

我试图在我的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

0 个答案:

没有答案