दिलचस्प पोस्ट
ImportError: _ssl नामक कोई मॉड्यूल नहीं है जावा में कॉपी निर्माता क्यों नहीं है? एएसपी से चयनित मान पढ़ना: रेडियोबटन सूची jQuery का उपयोग करना WebView को "वेब पेज उपलब्ध नहीं" प्रदर्शित करने से रोकें सी में "बैकस्पेस" एस्केप वर्ण '\ b', अप्रत्याशित व्यवहार? सॉकेट पर जावा कई फ़ाइल स्थानांतरण मैं आईफोन पर इनलाइन विधानसभा कैसे करूं? जावा में दो रंग "स्वाभाविक रूप से" मिश्रण करना कैसे 2 ints के विभाजन बनाने के लिए एक और int के बजाय एक नाव का उत्पादन? MySQL प्रश्नों में, क्यों उपयोग के बजाय क्यों उपयोग करें? जावा मैट्रिक्स गणित पुस्तकालयों का प्रदर्शन? सूची :: आकार () वास्तव में हे (एन) है? 64-बिट विंडोज पर सेट अप टूल्स स्थापित करना गिट (संख्या और आकार) में फ़ाइल सीमाएं क्या हैं? आवारा / वर्चुअलबॉक्स / अपाचे 2 अजीब कैश व्यवहार

मैं डीजेंगो में इस दौड़ की स्थिति से कैसे निपटूं?

यह कोड प्राप्त करने या किसी ऑब्जेक्ट को तैयार करने और आवश्यकतानुसार अपडेट करने के लिए माना जाता है। कोड एक वेबसाइट पर उत्पादन उपयोग में है।

कुछ मामलों में – जब डेटाबेस व्यस्त है – यह "DoNotExist: MyObj मिलान क्वेरी मौजूद नहीं है" अपवाद फेंक देगा

# Model: class MyObj(models.Model): thing = models.ForeignKey(Thing) owner = models.ForeignKey(User) state = models.BooleanField() class Meta: unique_together = (('thing', 'owner'),) # Update or create myobj @transaction.commit_on_success def create_or_update_myobj(owner, thing, state) try: myobj, created = MyObj.objects.get_or_create(owner=user,thing=thing) except IntegrityError: myobj = MyObj.objects.get(owner=user,thing=thing) # Will sometimes throw "DoesNotExist: MyObj matching query does not exist" myobj.state = state myobj.save() 

मैं उबंटु पर एक आतिशबासी mysql डेटाबेस का उपयोग करता हूं

मैं इस समस्या से कैसे सुरक्षित रूप से निपटूं?

Solutions Collecting From Web of "मैं डीजेंगो में इस दौड़ की स्थिति से कैसे निपटूं?"

यह एक समान समस्या का एक निशानाबाज़ यहां हो सकता है:

यह लूप प्रत्येक 5 सेकंड में अपडेट किए गए ऑब्जेक्ट को क्यों नहीं दिखाता?

असल में get_or_create असफल हो सकता है – यदि आप इसके स्रोत पर एक नज़र डालते हैं, तो आप देखेंगे कि यह है: प्राप्त करें, अगर-समस्या: कुछ- टिकरी को बचाएं, अगर-अभी-समस्या: फिर से मिलें, अगर-अभी-समस्या: आत्मसमर्पण और बढ़ाएं ।

इसका मतलब यह है कि यदि दो समानांतर थ्रेड्स (या प्रोसेस) बना रहे हैं तो create_or_update_myobj चला रहे create_or_update_myobj , दोनों ही वस्तु को प्राप्त करने या बनाने की कोशिश कर रहे हैं, तो:

  • पहले धागे इसे प्राप्त करने की कोशिश करता है – लेकिन यह अभी तक मौजूद नहीं है,
  • इसलिए, धागा इसे बनाने की कोशिश करता है, लेकिन ऑब्जेक्ट बनाया जाने से पहले …
  • … दूसरा धागा इसे प्राप्त करने की कोशिश करता है – और यह स्पष्ट रूप से विफल रहता है
  • अब, MySQLdb डेटाबेस कनेक्शन के लिए डिफ़ॉल्ट AUTOCOMMIT = OFF की वजह से, और पुनरावृत्ति READ सीरियलाइज योग्य स्तर, दोनों धागे ने MyObj तालिका के अपने विचारों को जमे हुए हैं
  • बाद में, पहले थ्रेड ने अपना ऑब्जेक्ट बनाया है और इसे शानदार ढंग से वापस किया है, लेकिन …
  • … दूसरा धागा कुछ भी नहीं बना सकता क्योंकि यह unique बाधा का उल्लंघन करेगा
  • क्या मजेदार है, बाद में दूसरे धागे पर आते हैं, पहले ऑब्जेक्ट में निर्मित ऑब्जेक्ट को नहीं देखते हैं, MyObj तालिका के जमे हुए दृश्य के कारण

इसलिए, अगर आप कुछ भी सुरक्षित रूप से get_or_create कर लेना चाहते हैं, तो get_or_create कुछ प्रयास करें:

  @transaction.commit_on_success def my_get_or_create(...): try: obj = MyObj.objects.create(...) except IntegrityError: transaction.commit() obj = MyObj.objects.get(...) return obj 

27/05/2010 को संपादित

समस्या का एक दूसरा समाधान भी है- READETABLE READ की बजाय READ COMMITED अलगाव स्तर का उपयोग करना। लेकिन यह कम से कम (MySQL में कम से कम) परीक्षण किया गया है, इसलिए इसमें अधिक बग / समस्याएं हो सकती हैं – लेकिन कम से कम यह बीच में बिना किए लेनदेन को देखने के लिए अनुमति देता है।

22/01/2012 को संपादित

MySQL और Django के बारे में इस प्रश्न से संबंधित कुछ अच्छे ब्लॉग पोस्ट (मेरा नहीं है):

http://www.no-ack.org/2010/07/mysql-transactions-and-django.html

http://www.no-ack.org/2011/05/broken-transaction-management-in-mysql.html

आपका अपवाद हैंडलिंग त्रुटि मास्किंग है आपको get_or_create() में state लिए एक मान देना चाहिए, या मॉडल और डेटाबेस में एक डिफ़ॉल्ट सेट करना चाहिए।

एक (गूंगा) तरीका त्रुटि को पकड़ने के लिए हो सकता है और थोड़ी सी समय की प्रतीक्षा करने के बाद बस एक या दो बार दोबारा पुन: प्रयास करें। मैं एक डीबी विशेषज्ञ नहीं हूं, इसलिए कोई संकेत समाधान हो सकता है।