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);
}
}
सुनिश्चित करें कि यह लॉक तंत्र एक लेन-देन के अंदर है क्योंकि जब कोई लेन-देन किया जाता है या रोलबैक किया जाता है तो लॉक जारी किया जाएगा।