sql >> Databasteknik >  >> RDS >> PostgreSQL

Spring Data Pessimistic Lock timeout med Postgres

javax.persistence.lock.timeout fungerar inte heller för mig när det tillhandahålls som nedan

@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout",value = "15000")})

Men sedan provade jag något annat som fungerade. Istället för att använda @Repository och CrudRepository, konfigurerar jag nu min viloläge med hjälp av enhetshanteraren. Använde createQuery tillsammans med lås och inställning av timeout för lås. Och den här konfigurationen fungerar som förväntat. Jag har två transaktioner som körs parallellt och försöker låsa exakt samma rad i DB. Den första transaktionen kan förvärva WRITE-låset och håller låset i cirka 10 sekunder innan låset släpps. Under tiden försöker den andra transaktionen få lås på samma rad, men eftersom javax.persistence.lock.timeout är inställd på 15 sekunder, väntar den på att låset släpps och får sedan sitt eget lås. Därför görs flödet serialiserat.

@Component
public class Repository {

    @PersistenceContext
    private EntityManager em;

    public Optional<Cache> getById(int id){
        List<Cache> list = em.createQuery("select c from Cache c where c.id = ?1")
                            .setParameter(1, id)
                            .setHint("javax.persistence.lock.timeout", 15000)
                            .setLockMode(LockModeType.PESSIMISTIC_WRITE)
                            .getResultList();


        return Optional.ofNullable(list.get(0));
    }

    public void save(Cache cache) {
        cache = em.find(Cache.class, cache.getId());
        em.merge(cache);
    }
}

Se till att den här låsmekanismen finns i en transaktion eftersom låset kommer att släppas när antingen en transaktion genomförs eller återställs.



  1. Ändra tidszonvärde för data

  2. Mysql spatial distans med hjälp av POINT - Fungerar inte

  3. PostgreSQL Få en slumpmässig datetime/timestamp mellan två datetime/timestamp

  4. MySQL-komposit unik på FK:s