sql >> Database teknologi >  >> RDS >> PostgreSQL

Spring Data Pessimistic Lock timeout med Postgres

javax.persistence.lock.timeout virker heller ikke for mig, når den leveres som nedenfor

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

Men så prøvede jeg noget andet, som virkede. I stedet for at bruge @Repository og bruge CrudRepository, konfigurerer jeg nu min dvale ved hjælp af entity manager. Brugte createQuery sammen med lås og indstilling af låsetimeout. Og denne konfiguration fungerer som forventet. Jeg har to transaktioner, der kører parallelt og forsøger at låse en nøjagtig samme række i DB. Den første transaktion er i stand til at erhverve WRITE-låsen og holder låsen i omkring 10 sekunder, før den frigives. I mellemtiden forsøger den anden transaktion at opnå lås på den samme række, men da javax.persistence.lock.timeout er indstillet til 15 sekunder, venter den på at låsen udløses og får derefter sin egen lås. Derfor gør strømmen serialiseret.

@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);
    }
}

Sørg for, at denne låsemekanisme er inde i en transaktion, fordi låsen frigives, når enten en transaktion er begået eller rullet tilbage.



  1. Brug af MEDIAN sammen med funktionerne MAX, MIN og AVG i MySQL

  2. opret array fra mysql forespørgsel php

  3. Sådan finder du dublerede værdier i en SQL-tabel

  4. hvordan man gemmer BigInteger-værdier i Oracle-databasen