मेरे पास ओरेकल डेटाबेस है जिसे मैं देवर्ट और एंटिटी फ्रेमवर्क का उपयोग करके एक्सेस करता हूं।डेटाबेस तालिका में समवर्ती पढ़ने और अद्यतन
IMPORTJOBS
नामक एक तालिका STATUS
के साथ एक तालिका है।
मेरे पास एक ही समय में कई प्रक्रियाएं चल रही हैं। वे प्रत्येक IMPORTJOBS
में पहली पंक्ति पढ़ते हैं जिसमें 'REGISTERED'
स्थिति है, इसे 'EXECUTING'
स्थिति में रखें, और यदि इसे 'EXECUTED'
स्थिति में डाल दिया गया है।
अब क्योंकि इन प्रक्रियाओं समानांतर में चल रहे हैं, मेरा मानना है कि निम्न हो सकता है:
- प्रक्रिया एक पंक्ति 10 जो स्थिति
REGISTERED
है पढ़ता है, - प्रक्रिया बी भी पंक्ति 10 जो अभी भी है स्थिति
REGISTERED
पढ़ता , - प्रक्रिया
EXECUTING
स्थिति के लिए एक पंक्ति पंक्ति 10 अद्यतन।
प्रक्रिया बी पंक्ति 10 को पढ़ने में सक्षम नहीं होना चाहिए क्योंकि प्रक्रिया ए पहले ही इसे पढ़ चुकी है और इसकी स्थिति अपडेट करने जा रही है।
मुझे इसे कैसे हल करना चाहिए? एक लेनदेन में पढ़ और अद्यतन रखो? या मुझे कुछ संस्करण दृष्टिकोण या कुछ और उपयोग करना चाहिए?
धन्यवाद!
संपादित करें: स्वीकृत उत्तर के लिए धन्यवाद, मैंने इसे काम किया और इसे यहां दस्तावेज किया: http://ludwigstuyck.wordpress.com/2013/02/28/concurrent-reading-and-writing-in-an-oracle-database।
धन्यवाद, मैं आयात सूची से "चयन * निष्पादित करने की कोशिश कर रहा हूं जहां स्टेटसकोडे = 'पंजीकृत' और ROWNUM <= 1 अपडेट की गई अद्यतन के लिए <= 1 है, लेकिन यह अभी भी विभिन्न प्रक्रियाओं से एक ही पंक्ति को वापस कर रहा है? –
(1) सुनिश्चित करें कि आपने ऑटोकॉमिट बंद कर दिया है: आप लेनदेन के बिना एक पंक्ति को लॉक नहीं कर सकते हैं। (2) 'अपडेट स्कीप लॉकड' और 'राउनम' के लिए [जैसा कि आप उम्मीद करते हैं उतना काम नहीं करेगा] (http://stackoverflow.com/questions/5847228/oracle-select-for-update-behaviour) - ऐसा इसलिए है क्योंकि ** WHERE क्लॉज के बाद ** स्किप लॉकड का मूल्यांकन ** किया जाता है। बिना किसी राउनम के चयन का उपयोग करें, एक (या आवश्यकतानुसार अधिक) पंक्ति प्राप्त करें और कर्सर को बंद करें, यह स्किप लॉक का उपयोग करने का सबसे अच्छा तरीका है। –
वास्तव में, मुझे एक लेनदेन में चयन और अद्यतन करना पड़ा, अब यह काम करता है। धन्यवाद!!! –