Я хочу реализовать блокировку пропуска. Я использую postgres 9.6.17. Я использую следующий код
@Lock(LockModeType.PESSIMISTIC_WRITE)
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value = "-2")})
@Query("Select d from Demo d where d.id in (?1)")
List<Demo> getElementByIds(List<Long> ids);
Я делаю один и тот же вызов БД из 2 служб одновременно через cmd (параллельный запрос Curl обоим службам, которые выполняют вызов БД). С 1 сервера я передаю идентификаторы с 1 ... 4, а с другого - с 1 ..... 7. Но в случае, если первый сервис берет блокировку на 1 ... 4 строке, а затем второй сервис должен ждать, пока первый сервис не снимет свою блокировку, но в идеале второй сервис должен вернуть строки 5 ... 7 из первого сервиса I я звоню вот так
List<Long> ids = new ArrayList<>();
ids.add(1l);
ids.add(2l);
ids.add(3l);
ids.add(4l);
List<Demo> demos = demoRepo.getElementByIds(ids);
try{
Thread.sleep(500);
} catch (Exception e) {
}
logger.info("current time: " + System.currentTimeMillis());
и из второго сервиса звоню так:
List<Long> ids = new ArrayList<>();
ids.add(1l);
ids.add(2l);
ids.add(3l);
ids.add(4l);
ids.add(5l);
ids.add(6l);
ids.add(7l);
try{
Thread.sleep(100);
} catch (Exception e) {
}
logger.info("current time: " + System.currentTimeMillis());
List<Demo> demos = demoRepo.getElementByIds(ids);
logger.info("current time: " + System.currentTimeMillis());
Но всегда оба запроса возвращают одни и те же строки, которые я спрашиваю после ожидания другого сервис для снятия блокировки.
Spring JPA-версия, которую я использую:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.5.RELEASE</version>
Я также пробовал на самом уровне приложения spring.jpa.javax.persistence.lock.timeout = - 2, что также не работает. Кажется, что оба метода работают как PESSIMISTIC_WRITE.
Пожалуйста, подскажите, как мне добиться пропуска заблокированной функциональности.