Twój kod jest w porządku. Wszystko, co musisz pamiętać, to to, że PESSIMISTIC_WRITE używa SELECT … FOR UPDATE SKIP LOCKED
w Oracle i PostgreSQL 9.5 . Zakładam, że mogłeś zapomnieć o poinformowaniu JPA, że masz korzystać z nowszej wersji Postgresa. Masz więc dwie opcje:
- powiedz JPA, że używasz dialektu PostgreSQL, który obsługuje
SKIP LOCKED
:
Po tym otrzymałem żądany wynik:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
i oczywiście współbieżny wątek nie był w stanie pobrać zablokowanych wierszy, dopóki transakcja nie została zakończona.where subscripti0_.valid_until<=? and subscripti0_.status='ACTIVE' for update of subscripti0_1_ skip locked
- użyj natywnego zapytania :
SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED