मुझे लगता है कि आप समस्या को गलत तरीके से हल करने की कोशिश कर रहे हैं। आप जो चाहते हैं वह डेटाबेस संगति की अधिकतम सुरक्षा है। यदि दो व्यक्ति एक ही समय में संग्रहीत कार्यविधि चलाते हैं, तो डेटाबेस संगतता का उल्लंघन हो सकता है।
विभिन्न प्रकार की डेटाबेस विसंगतियों से बचाने के लिए, SQL मानक में चार ट्रांजेक्शन आइसोलेशन स्तर होते हैं:
- READ UNCOMMITTED जहां मूल रूप से लेनदेन अपना मूल्य खो देते हैं, अन्य लेनदेन गंदे डेटा को देखते हैं। यह प्रयोग न करें!
- पढ़ें जहां लेनदेन केवल प्रतिबद्ध डेटा देखते हैं, लेकिन ऐसी विसंगतियां हो सकती हैं जहां दो लेनदेन एक दूसरे के पैर की उंगलियों पर कदम रख सकते हैं
- दोहराई गई प्रतिक्रिया जहां एक प्रकार की असंगतता, गैर-दोहराई जाने वाली रीड, को हल किया जाता है
- अनुक्रमिक जो गारंटी देता है कि कुछ आभासी आदेश मौजूद है जिसमें लेनदेन को निष्पादित करने से उन परिणामों को प्राप्त होगा जो उनके निष्पादन के परिणामस्वरूप हुए थे
हालाँकि, SQL मानक में इन डेटाबेस विसंगतियों के लिए एक लॉकिंग आधारित दृष्टिकोण है, और प्रदर्शन कारणों से कई डेटाबेस स्नैपशॉट अलगाव आधारित दृष्टिकोण लेते हैं जो मूल रूप से इन स्तरों पर हैं:
- READ COMMITTED जो लॉकिंग डेटाबेस में है वही है
- SNAPSHOT अलगाव जहां डेटाबेस सभी डेटा का एक स्नैपशॉट देखता है और अगर यह किसी अन्य लेन-देन द्वारा अपडेट की गई पंक्ति को अपडेट करने का प्रयास करता है, तो इसे रद्द कर दिया जाता है, फिर भी कुछ प्रसिद्ध विसंगतियां हैं जो हो सकती हैं
- अनुक्रमिक जो कि वैसा ही है जैसा कि लॉकिंग डेटाबेस में है, लेकिन इस बार एक अलग तरीके से कार्यान्वित किया जाता है, ताले लेने से नहीं, लेकिन यह सुनिश्चित करने से कि कोई धारावाहिक उल्लंघन नहीं होता है, और यदि ऐसा उल्लंघन पाया जाता है, तो लेनदेन रद्द करना
इन स्नैपशॉट अलगाव आधारित डेटाबेस में लेन-देन रद्द करना चिंताजनक लग सकता है, लेकिन फिर हर एक डेटाबेस एक गतिरोध के कारण लेनदेन को रद्द कर देगा, इसलिए किसी भी उचित एप्लिकेशन को लेनदेन को फिर से आज़माने में सक्षम होने की आवश्यकता है।
आप जो चाहते हैं वह SERIALIZABLE अलगाव स्तर है: यह सुनिश्चित करता है कि यदि लेनदेन एक अच्छे राज्य में दूसरे परिणाम के बाद स्वतंत्र रूप से निष्पादित किया जाता है, तो लेन-देन के किसी भी समानांतर निष्पादन के परिणामस्वरूप भी एक अच्छी स्थिति होती है। सौभाग्य से, माइकल काहिल है उनकी डॉक्टरेट शोध प्रबंध में पता चला कैसे serializable अलगाव स्तर कम प्रयास के साथ स्नैपशॉट पृथक डेटाबेस द्वारा समर्थित किया जा सकता है।
यदि स्नैपशॉट पृथक डेटाबेस में एक अनुक्रमिक पृथक्करण स्तर का उपयोग करते हुए , यदि दो लोग संग्रहीत प्रक्रिया को समवर्ती रूप से चलाने का प्रयास करते हैं और वे एक दूसरे के पैर की उंगलियों पर कदम रखते हैं, तो लेनदेन में से एक को रद्द कर दिया जाएगा।
अब, SQL सर्वर वास्तव में SERIALIZABLE आइसोलेशन स्तर का समर्थन करता है (बदले में SER कीवर्ड के पीछे स्नैपशॉट अलगाव के बजाय )? स्पष्ट रूप से, मुझे नहीं पता: एकमात्र डेटाबेस जो मुझे पता है कि यह समर्थन करता है वह PostgreSQL है।
भले ही मैं SQL सर्वर को विशिष्ट सलाह देने में विफल रहा, फिर भी मैं अभी भी इस उत्तर को पोस्ट कर रहा हूं, क्योंकि PostgreSQL के उपयोगकर्ता और अन्य डेटाबेस के उपयोगकर्ता जो PostgreSQL पर स्विच करने पर विचार कर सकते हैं, वे मेरे उत्तर से लाभ उठा सकते हैं। इसके अलावा, गैर- PostgreSQL डेटाबेस के उपयोगकर्ता जो PostgreSQL पर स्विच नहीं कर सकते हैं, वे अपने पसंदीदा डेटाबेस विक्रेता पर वास्तविक SERIALIZABLE अलगाव स्तर की पेशकश कर सकते हैं ।