Dein Code ist in Ordnung. Alles, woran Sie denken müssen, ist, dass PESSIMISTIC_WRITE einen SELECT … FOR UPDATE SKIP LOCKED
verwendet in Oracle und PostgreSQL 9.5 . Ich nehme an, Sie hätten vergessen können, JPA mitzuteilen, dass Sie eine neuere Version von Postgres verwenden sollen. Sie haben also zwei Möglichkeiten:
- teilen Sie JPA mit, dass Sie PostgreSQL Dialect verwenden, das
SKIP LOCKED
unterstützt :
Danach erhielt ich die gewünschte Ausgabe:spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
und offensichtlich war der gleichzeitige Thread nicht in der Lage, gesperrte Zeilen abzurufen, bis die Transaktion abgeschlossen war.where subscripti0_.valid_until<=? and subscripti0_.status='ACTIVE' for update of subscripti0_1_ skip locked
- native Abfrage verwenden:
SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED