sql >> Databáze >  >> RDS >> PostgreSQL

Časový limit Spring Data Pesimistic Lock s Postgresem

javax.persistence.lock.timeout mi také nebude fungovat, když je poskytnut níže

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

Ale pak jsem zkusil něco jiného, ​​co fungovalo. Namísto použití @Repository a použití CrudRepository nyní konfiguruji hibernaci pomocí správce entity. Použito createQuery spolu se zámkem a nastavením časového limitu zámku. A tato konfigurace funguje podle očekávání. Mám dvě transakce běžící paralelně a snažím se zamknout přesně stejný řádek v DB. První transakce je schopna získat zámek WRITE a podrží zámek po dobu přibližně 10 sekund, než zámek uvolní. Druhá transakce se mezitím pokouší získat zámek na stejném řádku, ale protože javax.persistence.lock.timeout je nastaven na 15 sekund, čeká na uvolnění zámku a poté získá svůj vlastní zámek. Proto je tok serializován.

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

Ujistěte se, že tento mechanismus zámku je uvnitř transakce, protože zámek se uvolní, když je transakce potvrzena nebo odvolána.



  1. Aktualizujte více sloupců z poddotazu

  2. název proměnné databáze

  3. Přihlášení fondu připojení DBCPTimeout

  4. Moje webhostingová společnost říká, že s kódem PHP není něco v pořádku