जबकि इरविन का सुझाव संभवतः सरल है सही व्यवहार प्राप्त करने का तरीका (जब तक आप SQLSTATE
के साथ अपवाद प्राप्त करते हैं, तब तक आप अपने लेन-देन का पुन:प्रयास करते हैं 40001 का), अपनी प्रकृति के अनुसार कतारबद्ध अनुप्रयोग, SERIALIZABLE
के PostgreSQL कार्यान्वयन की तुलना में कतार में अपनी बारी लेने के अवसर के लिए अवरुद्ध अनुरोधों के साथ बेहतर काम करते हैं। लेन-देन, जो उच्च संगामिति की अनुमति देता है और टकराव की संभावना के बारे में कुछ अधिक "आशावादी" है।
प्रश्न में उदाहरण क्वेरी, जैसा कि यह खड़ा है, डिफ़ॉल्ट READ COMMITTED
. में है लेन-देन अलगाव स्तर दो (या अधिक) समवर्ती कनेक्शन को कतार से एक ही पंक्ति "दावा" करने की अनुमति देगा। यह क्या होगा:
- T1 शुरू होता है और
UPDATE
. में पंक्ति को लॉक करने तक पहुंच जाता है चरण। - T2 निष्पादन समय में T1 को ओवरलैप करता है और उस पंक्ति को अपडेट करने का प्रयास करता है। यह लंबित
COMMIT
. को रोकता है याROLLBACK
T1 का। - T1 पंक्ति का सफलतापूर्वक "दावा" करने के बाद प्रतिबद्ध है।
- T2 पंक्ति को अद्यतन करने का प्रयास करता है, पाता है कि T1 पहले से ही है, पंक्ति के नए संस्करण की तलाश करता है, पाता है कि यह अभी भी चयन मानदंड को पूरा करता है (जो कि केवल
id
है) मैच), और पंक्ति का "दावा" भी करता है।
इसे सही ढंग से काम करने के लिए संशोधित किया जा सकता है (यदि आप PostgreSQL के एक संस्करण का उपयोग कर रहे हैं जो FOR UPDATE
की अनुमति देता है एक सबक्वेरी में क्लॉज)। बस FOR UPDATE
जोड़ें सबक्वेरी के अंत तक जो आईडी का चयन करता है, और यह होगा:
- T1 प्रारंभ होता है और अब चयन . से पहले पंक्ति को लॉक कर देता है आईडी।
- T2 निष्पादन समय में T1 को ओवरलैप करता है और
COMMIT
लंबित आईडी का चयन करने का प्रयास करते समय ब्लॉक करता है याROLLBACK
T1 का। - T1 पंक्ति का सफलतापूर्वक "दावा" करने के बाद प्रतिबद्ध है।
- जब तक T2 पढ़ने . में सक्षम हो जाता है आईडी देखने के लिए पंक्ति, यह देखती है कि उस पर दावा किया गया है, इसलिए उसे अगली उपलब्ध आईडी मिल जाती है।
REPEATABLE READ
. पर या SERIALIZABLE
लेन-देन अलगाव स्तर, लेखन संघर्ष एक त्रुटि फेंक देगा, जिसे आप पकड़ सकते हैं और निर्धारित कर सकते हैं कि SQLSTATE के आधार पर क्रमबद्धता विफलता थी, और पुनः प्रयास करें।
यदि आप आम तौर पर क्रमिक लेन-देन चाहते हैं, लेकिन आप कतार क्षेत्र में पुन:प्रयास से बचना चाहते हैं, तो आप एक सलाहकार लॉक का उपयोग करके इसे पूरा करने में सक्षम हो सकते हैं।