PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Spring Data JPA + Hibernate Ignorer les lignes verrouillées (PostgreSQL)

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 :
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect
    
    Après cela, j'ai reçu la sortie souhaitée :
    where
        subscripti0_.valid_until<=? 
    and subscripti0_.status='ACTIVE' 
    for update of subscripti0_1_ skip locked
    
    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.
  • utiliser la requête native :
    SELECT * FROM objects o WHERE o.valid_until <= :validUntil FOR UPDATE SKIP LOCKED