Votre code est bon. Tout ce que vous devez retenir est que PESSIMISTIC_WRITE utilise un SELECT … FOR UPDATE SKIP LOCKED
dans Oracle et PostgreSQL 9.5 . Je suppose que vous avez peut-être oublié de dire à JPA que vous devez utiliser la nouvelle version de Postgres. Vous avez donc deux options :
- indiquez à JPA que vous utilisez le dialecte PostgreSQL qui prend en charge
SKIP LOCKED
:
Après cela, j'ai reçu la sortie souhaitée :spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
et évidemment, le thread concurrent n'a pas pu récupérer les lignes verrouillées tant que la transaction n'était pas terminée.where subscripti0_.valid_until<=? and subscripti0_.status='ACTIVE' for update of subscripti0_1_ skip locked
- utiliser la requête native :
SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED