हम एक आवेदन पत्र में कुछ लगातार डेटा पर ब्लॉक "अद्यतन के लिए चुनें", कि एक सर्वर से क्वेरी की जाती है और फिर एक डेटाबेस में संग्रहीत तो हम अतिरिक्त जानकारी का ट्रैक रख सकते। चूंकि हम क्वेरी में नहीं चाहते हैं कि स्मृति में ऑब्जेक्ट का उपयोग कब किया जाता है, हम select for update
करते हैं ताकि अन्य थ्रेड जो एक ही डेटा प्राप्त करना चाहते हैं, अवरुद्ध हो जाएंगे।है nonrexisting पंक्तियों
मुझे यकीन है कि कैसे select for update
गैर-मौजूद पंक्तियों हैंडल नहीं कर रहा हूँ। यदि पंक्ति मौजूद नहीं है और एक अन्य धागा एक ही पंक्ति पर select for update
करने की कोशिश करता है, तो क्या यह थ्रेड अवरुद्ध हो जाएगा जब तक अन्य लेनदेन समाप्त नहीं हो जाता है या क्या इसे खाली परिणाम सेट भी मिल जाएगा? यदि यह केवल खाली परिणाम सेट प्राप्त करता है तो इसे ब्लॉक करने का कोई तरीका भी है, उदाहरण के लिए गायब पंक्ति को तत्काल डालने से?
संपादित करें:
क्योंकि वहाँ एक टिप्पणी थी, कि हम बहुत ज्यादा यहाँ हमारे मामले में ठोस उपयोग पर कुछ और जानकारी लॉक हो सकता है। कम स्यूडोकोड में हमारे programm प्रवाह इस तरह दिखता है:
d = queue.fetch();
r = SELECT * FROM table WHERE key = d.key() FOR UPDATE;
if r.empty() then
r = get_data_from_somewhere_else();
new_r = process_stuff(r);
if Data was present then
update row to new_r
else
insert new_r
इस कोड को कई धागा और डेटा है कि कतार से प्राप्त किए गए है डेटाबेस में एक ही पंक्ति (इसलिए ताला) के विषय में किया जा सकता है में चलाया जाता है। हालांकि यदि एकाधिक थ्रेड डेटा का उपयोग कर रहे हैं जो एक ही पंक्ति की आवश्यकता है, तो इन थ्रेडों को अनुक्रमिक करने की आवश्यकता है (ऑर्डर कोई फर्क नहीं पड़ता)। हालांकि यह अनुक्रमिकता विफल हो जाती है, यदि पंक्ति मौजूद नहीं है, क्योंकि हमें लॉक नहीं मिलता है।
संपादित करें:
अब मैं निम्नलिखित समाधान, जो मेरे लिए एक बदसूरत हैक की तरह लगता है है के लिए।
select the data for update
if zero rows match then
insert some dummy data // this will block if multiple transactions try to insert
if insertion failed then
// somebody beat us at the race
select the data for update
do processing
if data was changed then
update the old or dummy data
else
rollback the whole transaction
मैं न तो 100% यकीन है कि हालांकि कि यह वास्तव में समस्या का हल, और न ही इस समाधान अच्छा शैली लगते करता हूँ। तो अगर किसी को कुछ और उपयोग करने योग्य पेशकश करना है तो यह बहुत अच्छा होगा।
आपके संपादन के संबंध में: आपको लॉक कहां मिल रहा है? –
@Catcall: ऊपर, मैं चुनिंदा वक्तव्य में "अद्यतन के लिए" भूल गया। तो यह वह जगह है जहां ताला लगाया जाता है। – LiKao