आपका प्रश्न, किसी अज्ञात स्रोत का संदर्भ देते हुए:
<ब्लॉककोट>मैंने पंक्ति लॉकिंग में देखा, लेकिन यह कहता है कि आप उन चयनों को रोक नहीं सकते हैं जो ऐसा लगता है कि यह मेरी स्थिति के लिए काम नहीं करेगा। सलाहकार ताले का उपयोग करने के लिए Ismy एकमात्र विकल्प है?
इस मामले पर आधिकारिक दस्तावेज:
<ब्लॉककोट>पंक्ति-स्तरीय लॉक डेटा क्वेरीिंग को प्रभावित नहीं करते हैं; वे केवल राइटर और लॉकर . को ब्लॉक करते हैं एक ही पंक्ति में।
समवर्ती प्रयास न केवल चयन करेंगे बल्कि SELECT ... FOR UPDATE
के साथ समान पंक्ति-स्तरीय लॉक को निकालने का प्रयास करेंगे। - जिसके कारण उन्हें किसी भी पिछले लेन-देन की प्रतीक्षा करने के लिए एक ही पंक्ति पर लॉक रखने या वापस रोल करने के लिए प्रतीक्षा करनी पड़ती है। बस वही जो आप चाहते थे।
हालांकि , कई उपयोग के मामलों को सलाहकार लॉक . के साथ बेहतर ढंग से हल किया जाता है - 9.5 से पहले के संस्करणों में। आप अभी भी FOR UPDATE
के साथ संसाधित की जा रही पंक्तियों को लॉक कर सकते हैं साथ ही सुरक्षित रहने के लिए। लेकिन अगर अगला लेन-देन केवल "अगली मुफ़्त पंक्ति" को संसाधित करना चाहता है, तो यह अक्सर बहुत होता है उसी पंक्ति की प्रतीक्षा न करने के लिए अधिक कुशल, जो लॉक जारी होने के बाद लगभग निश्चित रूप से अनुपलब्ध है, लेकिन तुरंत "अगला मुफ़्त" पर जाएं।
Postgres 9.5+ में FOR UPDATE SKIP LOCKED
इसके लिए। जैसे @Craig ने टिप्पणी की, यह काफी हद तक सलाहकार तालों की जगह ले सकता है।
संबंधित प्रश्न एक ही प्रदर्शन हॉग पर ठोकर खा रहा है:
- फ़ंक्शन हमेशा के लिए बड़ी संख्या में रिकॉर्ड के लिए चल रहा है
एडवाइजरी लॉक के लिए स्पष्टीकरण और कोड उदाहरण या FOR UPDATE SKIP LOCKED
पोस्टग्रेज 9.5+ में:
- अद्यतन पोस्ट करता है ... सीमा 1
एक साथ कई पंक्तियों को लॉक करने के लिए :
- समवर्ती पहुंच पर तालिका में कुछ निश्चित पंक्तियों को कैसे चिह्नित करें