PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Spring Data JPA + Hibernate Gesperrte Zeilen überspringen (PostgreSQL)

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 :
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
    
    Danach erhielt ich die gewünschte Ausgabe:
    where
        subscripti0_.valid_until<=? 
    and subscripti0_.status='ACTIVE' 
    for update of subscripti0_1_ skip locked
    
    und offensichtlich war der gleichzeitige Thread nicht in der Lage, gesperrte Zeilen abzurufen, bis die Transaktion abgeschlossen war.
  • native Abfrage verwenden:
    SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED