संभावित परिदृश्यों के एक जोड़े को हल करना आसान है, और एक बुरा नहीं है।
उस उपयोगकर्ता के लिए जो किसी मूल्य में प्रवेश करता है, तो कुछ समय बाद उसी मूल्य में प्रवेश करता है जब INSERT के सामने एक सरल चयन समस्या का पता लगाएगा। यह उस स्थिति के लिए काम करता है जहां एक उपयोगकर्ता एक मान जमा करता है और कुछ समय बाद दूसरा उपयोगकर्ता उसी मान को जमा करता है।
यदि उपयोगकर्ता डुप्लिकेट के साथ मानों की एक सूची प्रस्तुत करता है - तो {ABC, DEF, ABC} - कोड के एक ही मंगलाचरण में डुप्लिकेट्स का पता लगा सकते हैं और फ़िल्टर कर सकते हैं, शायद एक त्रुटि फेंकते हुए। आपको यह भी जांचने की आवश्यकता होगी कि डीबी डालने से पहले किसी भी अद्वितीय मान को शामिल नहीं करता है।
ट्रिकी परिदृश्य तब होता है जब एक उपयोगकर्ता का लेखन उसी समय किसी अन्य उपयोगकर्ता के लेखन के रूप में DBMS के अंदर होता है, और वे एक ही मूल्य लिख रहे होते हैं। फिर आप उनके बीच एक शर्त रखते हैं। चूँकि DBMS है (सबसे अधिक संभावना है - आप यह नहीं कहते कि आप किसका उपयोग कर रहे हैं) एक प्रीमेप्टिव मल्टीटास्किंग सिस्टम किसी भी कार्य को इसके निष्पादन में किसी भी बिंदु पर रोका जा सकता है। इसका मतलब है कि user1 का कार्य देख सकता है कि कोई मौजूदा पंक्ति नहीं है, फिर user2 का कार्य देख सकता है कि कोई मौजूदा पंक्ति नहीं है, फिर user1 का कार्य उस पंक्ति को सम्मिलित कर सकता है, फिर उपयोगकर्ता 2 का कार्य उस पंक्ति को सम्मिलित कर सकता है। प्रत्येक बिंदु पर कार्य व्यक्तिगत रूप से खुश हैं वे सही काम कर रहे हैं। हालाँकि, एक त्रुटि होती है।
आमतौर पर एक DBMS प्रश्न में मूल्य पर ताला लगाकर इसे संभालता है। इस समस्या में आप एक नई पंक्ति बना रहे हैं, इसलिए लॉक करने के लिए अभी तक कुछ भी नहीं है। जवाब एक रेंज लॉक है। जैसा कि यह सुझाव देता है कि यह मानों की एक सीमा को लॉक करता है, चाहे वे वर्तमान में मौजूद हों या नहीं। एक बार लॉक होने के बाद उस रेंज को किसी अन्य कार्य द्वारा एक्सेस नहीं किया जा सकता है। रेंज लॉक प्राप्त करने के लिए आपको SERIALIZABLE का निर्दिष्ट और अलगाव स्तर रखना होगा । आपके कार्य की जाँच करने के बाद एक पंक्ति में चुपके से किसी अन्य कार्य की घटना को प्रेत रिकॉर्ड्स के रूप में जाना जाता है ।
पूरे एप्लिकेशन में सीरियल स्तर पर अलगाव स्तर सेट करने के निहितार्थ होंगे। थ्रूपुट कम हो जाएगा। अन्य दौड़ स्थितियां जो पूर्व में काफी अच्छी तरह से काम करती थीं, अब त्रुटियां दिखाना शुरू कर सकती हैं। मैं इसे उस कनेक्शन पर सेट करने का सुझाव दूंगा जो आपके डुप्लिकेट-उत्प्रेरण कोड को निष्पादित करता है और शेष एप्लिकेशन को उसी तरह छोड़ रहा है।
कोड-आधारित विकल्प पहले के बजाय लिखने के बाद जांचना है । तो INSERT करें, फिर उन पंक्तियों की संख्या गिनें जिनके पास हैश मान है। यदि डुप्लिकेट हैं तो कार्रवाई को रोलबैक करें। इसके कुछ विकृत परिणाम हो सकते हैं। कार्य 1 कहें तो कार्य 2 लिखता है। फिर कार्य 1 जाँचता है और एक डुप्लिकेट पाता है। यह पहली बार होने के बावजूद वापस लौटता है। इसी तरह दोनों कार्यों में डुप्लिकेट और रोलबैक दोनों का पता लगाया जा सकता है। लेकिन कम से कम आपके पास काम करने के लिए एक संदेश होगा, एक पुन: प्रयास तंत्र और कोई नया डुप्लिकेट नहीं। रोलबैक को प्रोग्राम प्रवाह को नियंत्रित करने के लिए अपवादों का उपयोग करने पर बहुत पसंद किया जाता है। ध्यान दें कि सभीलेन-देन में काम वापस ले लिया जाएगा, न कि केवल डुप्लिकेट-उत्प्रेरण लेखन। और आपको स्पष्ट लेन-देन करना होगा जो कि संगामिति को कम कर सकता है। जब तक आपके पास हैश पर एक इंडेक्स न हो, डुप्लिकेट चेक बहुत ही धीमा होगा। यदि आप करते हैं तो आप इसे एक अनोखा बना सकते हैं!
जैसा कि आपने टिप्पणी की है कि वास्तविक समाधान एक अद्वितीय सूचकांक है। मुझे ऐसा लगता है कि यह आपके रखरखाव विंडो में फिट होना चाहिए (हालांकि निश्चित रूप से आप अपने सिस्टम को सबसे अच्छी तरह जानते हैं)। कहो हैश आठ बाइट्स है। एक सौ मिलियन पंक्तियों के लिए जो लगभग 1GB है। अनुभव से पता चलता है कि हार्डवेयर का एक उचित बिट इन कई पंक्तियों को एक या दो मिनट में बदल देगा। डुप्लीकेट चेकिंग और एलिमिनेशन को इससे जोड़ा जाएगा, लेकिन इसे पहले ही स्क्रिप्ट किया जा सकता है। यह सिर्फ एक तरफ है, हालांकि।