Как я могу добиться функциональности SKIP LOCKED, используя блокировку pessimisti c? - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу реализовать блокировку пропуска. Я использую 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.

Пожалуйста, подскажите, как мне добиться пропуска заблокированной функциональности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...