2013-06-17 5 views
5

Django documentation कहा गया है कि:select_for_update Django

यदि आप "स्वचालित लेनदेन" पर निर्भर थे select_for_update() और बाद में लिखने आपरेशन के बीच ताला प्रदान करने के लिए - एक अत्यंत नाजुक डिजाइन, लेकिन फिर भी संभव - आपको परमाणु() में प्रासंगिक कोड लपेटना होगा।

यही कारण है कि यह अब काम नहीं करता है कि autocommit डेटाबेस परत पर किया जाता है, न कि अनुप्रयोग परत? इससे पहले लेन-देन would be held open until a data-altering function is called:

Django के डिफ़ॉल्ट व्यवहार को एक खुला लेन-देन जो यह स्वचालित रूप से करता है जब किसी भी में निर्मित, डेटा फेरबदल मॉडल समारोह

और Django 1.6 के बाद से कहा जाता है के साथ चलाने के लिए है, डेटाबेस परत पर स्वतः कमांड के साथ, select_for_update उदाहरण के लिए write वास्तव में दो लेनदेन में चलाएगा? यदि ऐसा है, तो select_for_update बेकार नहीं है क्योंकि इसका बिंदु lock the rows until a data altering function was called था?

+0

डेटाबेस परत पर Autocommit django 1.6 के साथ आया, 1.5 नहीं। – fabspro

+0

@fabspro धन्यवाद - – Taras

उत्तर

5

select_for_update केवल एक ही लेन-देन के संदर्भ में चयनित पंक्ति लॉक हो जाएगा। यदि आप ऑटोोकॉमिट का उपयोग कर रहे हैं, तो ऐसा नहीं होगा जो आप सोचते हैं, क्योंकि प्रत्येक क्वेरी प्रभावी ढंग से अपना लेनदेन होगा (SELECT ... FOR UPDATE क्वेरी सहित)। transaction.atomic में अपना दृश्य (या अन्य फ़ंक्शन) लपेटें और यह वही करेगा जो आप इसे करने की उम्मीद कर रहे हैं।

+0

सही है, मैंने सोचा कि दस्तावेज़ प्रलेखन कह रहा था, लेकिन यदि यह सच है, तो यह select_for_update फ़ंक्शन को बेकार नहीं करता है (क्योंकि इसका मूल कारण प्रभावित पंक्तियों को लॉक करना था जब तक एक लेखन ऑपरेशन निष्पादित नहीं किया गया था) – Taras

+2

@ तारा - 'select_for_update' ठीक उसी तरह करता है जैसा कि इसे करने के लिए किया जाता है, लेकिन यदि आप इसे ऑटोोकॉमिट के साथ उपयोग करते हैं, तो आप अनिवार्य रूप से लॉक को सभी बार प्राप्त कर रहे हैं और रिलीज़ कर रहे हैं, जो बहुत मदद नहीं है। तो, क्वेरी सभी एक ही संचालित करती है, लेकिन किसी प्रकार के राज्य को बनाए रखने के लिए लेन-देन के बिना, पोस्टग्रेर्स को लॉक जारी करने के तुरंत बाद कैसे पता चलेगा (तुरंत के अलावा)? यदि यह सिर्फ उन्हें लिखने तक आयोजित करता है, तो एक खराब प्रोग्राम की कल्पना करें जिसने अद्यतन के लिए पंक्तियों का एक समूह चुना है और फिर अपवाद उठाता है। चयनित पंक्तियों को हमेशा के लिए बंद कर दिया जाएगा। – orokusaki

+0

मुझे लगता है कि अब मैं समझता हूं। 'select_for_update' autocommit के साथ उपयोगी नहीं है, लेकिन यह ** ** ** के लिए उपयोगी है जब ऑटोोकॉमिट व्यवहार का उपयोग नहीं किया जा रहा है, उदाहरण के लिए: जब लेनदेन स्पष्ट रूप से 'परमाणु' कथन के माध्यम से परिभाषित किया जाता है ..? – Taras