PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

पोस्टग्रेज के साथ स्प्रिंग डेटा निराशावादी लॉक टाइमआउट

javax.persistence.lock.timeout मेरे लिए काम नहीं कर रहा है या तो नीचे की तरह प्रदान किया गया है

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

लेकिन फिर मैंने कुछ और करने की कोशिश की जो काम कर गया। @Repository का उपयोग करने और CrudRepository का उपयोग करने के बजाय, अब मैं इकाई प्रबंधक का उपयोग करके अपने हाइबरनेट को कॉन्फ़िगर कर रहा हूं। लॉक और सेटिंग लॉक टाइमआउट के साथ createQuery का उपयोग किया। और यह कॉन्फ़िगरेशन अपेक्षा के अनुरूप काम कर रहा है। मेरे पास समानांतर में चल रहे दो लेनदेन हैं और डीबी में एक ही पंक्ति को लॉक करने का प्रयास कर रहे हैं। पहला लेन-देन WRITE लॉक प्राप्त करने में सक्षम है और लॉक को जारी करने से पहले लगभग 10 सेकंड के लिए लॉक रखता है। इस बीच, दूसरा लेन-देन उसी पंक्ति पर लॉक प्राप्त करने का प्रयास करता है लेकिन चूंकि javax.persistence.lock.timeout 15 सेकंड पर सेट है, यह लॉक जारी होने की प्रतीक्षा करता है और फिर अपना लॉक प्राप्त करता है। इसलिए प्रवाह को क्रमबद्ध बनाना।

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

सुनिश्चित करें कि यह लॉक तंत्र एक लेन-देन के अंदर है क्योंकि जब कोई लेन-देन किया जाता है या रोलबैक किया जाता है तो लॉक जारी किया जाएगा।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अतिव्यापी चर के साथ अलग-अलग तिथियों के साथ कई पंक्तियों को मिलाएं (पहली और अंतिम परिवर्तन तिथियों को पकड़ने के लिए)

  2. मुफ्त PostgreSQL प्रचार की लागत

  3. एसक्यूएल में सभी संयुक्त घटनाओं की गणना कैसे करें?

  4. पोस्टग्रेज:कमांड लाइन से डेटाबेस में टेबल बनाएं

  5. प्रति खिलाड़ी पूर्ण स्कोर की सबसे लंबी स्ट्रीक खोजें