संक्षिप्त संस्करण: "यह निर्भर करता है"।
लंबे संस्करण:
आप रीड-संशोधित-लिखने चक्र कर रहे हैं, तो न केवल यह एक सौदे में होना चाहिए, लेकिन आप किसी भी रिकॉर्ड आप बाद में संशोधित करने का इरादा SELECT ... FOR UPDATE
चाहिए। अन्यथा आप खोए गए लिखने का जोखिम उठाने जा रहे हैं, जहां आप रिकॉर्ड पढ़ते समय और जब आपने अपडेट लिखा था, तो आप किसी और के अपडेट को ओवरराइट करते हैं।
SERIALIZABLE
लेनदेन अलगाव इससे भी मदद कर सकता है।
आपको वास्तव में समेकन और अलगाव को समझने की आवश्यकता है। दुर्भाग्य से समझने के बिना केवल एकमात्र सरल, आसान "बस करें एक्स" जवाब यह है कि इसमें शामिल सभी तालिकाओं को लॉक करके प्रत्येक लेनदेन शुरू करना है। ज्यादातर लोग ऐसा नहीं करना चाहते हैं।
मैं the tx isolation docs के पढ़ने (या दो, या तीन, या चार - यह कठिन सामग्री) का सुझाव देता हूं। दौड़ की स्थिति और संघर्ष बनाने के लिए समवर्ती psql
सत्र (एकाधिक टर्मिनलों) के साथ प्रयोग।
स्रोत
2014-07-02 14:20:06
एक नोट Django उपयोगकर्ताओं के लिए: 'का चयन करें ... UPDATE' के लिए के माध्यम से उपलब्ध है Django का 'select_for_update' (https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update) –
@ScottStafford ... लेकिन दुर्भाग्यवश 'चयन करें ... साझा करने के लिए', या PostgreSQL की 'चयन ... कुंजी साझा करने के लिए' '' कुंजी अपडेट के लिए '। –
तो, यह सुनिश्चित करने के लिए कि मैं Django कोण के साथ अनुवर्ती हूं, 'MyObject.objects.get (pk = 5) जैसे कॉल' 'license.atomic()' या नहीं के अंदर कुछ भी लॉक नहीं करेगा। ऐसा करने के लिए मुझे दोनों को 'banking.atomic()' के अंदर होना चाहिए और 'MyObject.objects.select_for_update() जैसे किसी फॉर्म का उपयोग करना है। यह सुनिश्चित करने के लिए कि MyObject 5 को तब तक बदला नहीं जा सकता मेरा लेनदेन समाप्त होता है। –