आपको PESSIMISTIC_WRITE
. का उपयोग करने की आवश्यकता है क्वेरी के समय:
Query q = session
.createQuery("from MyObject n where n.state = 'NEW'")
.setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();
मूल वस्तुओं को लॉक करना पर्याप्त है। गतिरोध जरूरी नहीं होगा। यदि लॉक रखने वाला थ्रेड टाइम आउट वेटिंग से दूसरे थ्रेड से पहले इसे रिलीज़ नहीं करता है, तो आपको लॉक प्राप्ति विफलता मिल सकती है।
चूँकि आप Oracle का उपयोग कर रहे हैं, इस प्रकार अपडेट के लिए चुनें काम करता है:
इसलिए यदि T1 ने कुछ पंक्तियों पर एक विशेष लॉक प्राप्त किया है, तो T2 उन रिकॉर्ड्स को तब तक नहीं पढ़ पाएगा जब तक कि T1 कमिट या रोल-बैक नहीं करता। यदि T2 ने READ_UNCOMMITTED का उपयोग किया है अलगाव स्तर, तो T2 कभी भी लॉक रिकॉर्ड पर ब्लॉक नहीं करेगा, क्योंकि यह डेटा को फिर से बनाने के लिए पूर्ववत लॉग का उपयोग करता है जैसे कि यह क्वेरी शुरू होने पर था। SQL मानक के विपरीत, Oracle READ_UNCOMMITTED करेगा: