Váš kód je v pořádku. Vše, co si musíte zapamatovat, je, že PESSIMISTIC_WRITE používá SELECT … FOR UPDATE SKIP LOCKED
v Oracle a PostgreSQL 9.5 . Předpokládám, že jste mohli zapomenout říct JPA, že máte používat novější verzi Postgresu. Takže máte dvě možnosti:
- řekněte JPA, že používáte PostgreSQL Dialect, který podporuje
SKIP LOCKED
:
Poté jsem obdržel požadovaný výstup:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
a samozřejmě, souběžné vlákno nebylo schopno načíst zamčené řádky, dokud nebyla transakce dokončena.where subscripti0_.valid_until<=? and subscripti0_.status='ACTIVE' for update of subscripti0_1_ skip locked
- použijte nativní dotaz :
SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED