sql >> Database >  >> RDS >> PostgreSQL

Spring Data Pessimistic Lock-time-out met Postgres

javax.persistence.lock.timeout werkt ook niet voor mij als het wordt opgegeven zoals hieronder

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

Maar toen probeerde ik iets anders dat werkte. In plaats van @Repository en CrudRepository te gebruiken, configureer ik nu mijn slaapstand met behulp van de entiteitsmanager. Gebruikt createQuery samen met lock en setting lock timeout. En deze configuratie werkt zoals verwacht. Ik heb twee parallelle transacties en probeer exact dezelfde rij in DB te vergrendelen. De eerste transactie is in staat om WRITE lock te verkrijgen en houdt het slot ongeveer 10 seconden vast voordat het slot wordt vrijgegeven. Ondertussen probeert de tweede transactie een slot op dezelfde rij te krijgen, maar aangezien javax.persistence.lock.timeout is ingesteld op 15 seconden, wacht het tot het slot wordt vrijgegeven en verkrijgt dan zijn eigen slot. Vandaar dat de stroom geserialiseerd is.

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

Zorg ervoor dat dit vergrendelingsmechanisme zich in een transactie bevindt, omdat de vergrendeling wordt vrijgegeven wanneer een transactie wordt doorgevoerd of teruggedraaid.



  1. Parameter doorgeven aan mssql-query in node js

  2. Kan ingevoegde gegevens van MySQL niet onmiddellijk zien

  3. Meerdere rijen in een tabel invoegen op basis van een reeks getallen

  4. Hoe kom ik erachter wanneer een bepaalde tabel in Oracle is gemaakt?