2015-05-13 5 views
7

मैं एक निम्न सेटअप:Django बचाने() autocommit लेनदेन के साथ व्यवहार

  • कई डाटा प्रोसेसिंग कार्यकर्ताओं http द्वारा Django दृश्य get_conf() से विन्यास मिलता है।
  • विन्यास का उपयोग कर MySQL/InnoDB बैकएंड
  • विन्यास मॉडल Django मॉडल में संग्रहित है save() विधि है जो बताता है कि श्रमिकों विन्यास

फिर से लोड करने मैं देखा है कि कभी कभी श्रमिकों को सही ढंग से बदली हुई विन्यास प्राप्त नहीं होता है अधिरोहित गया है। विशेष रूप से, जब conf reload समय सामान्य से छोटा था, श्रमिकों को get_conf() से "पुराना" कॉन्फ़िगरेशन मिला (सबसे हालिया परिवर्तन गुम है)। Django में प्रयुक्त लेनदेन मॉडल डिफ़ॉल्ट autocommit है।

मैं निम्नलिखित संभव परिदृश्य है कि व्यवहार का कारण बन सकता के साथ आए हैं:

  1. नई विन्यास
  2. save() रिटर्न सहेजा जाता है लेकिन MySQL/InnoDB अभी भी (ऑटो) संसाधित कर रहा है
  3. श्रमिक प्रतिबद्ध हटा दिया गया और
  4. MySQL (ऑटो) खत्म
प्रतिबद्ध नया विन्यास के लिए http अनुरोध कर रहे हैं 0

क्या उपर्युक्त परिदृश्य में चरण 2 संभव है? यही है, क्या django मॉडल save() डेटा को वास्तव में डीबी में किया जा सकता है यदि ऑटोोकॉमिट लेनदेन विधि का उपयोग किया जा रहा है? या, एक परत नीचे जाने के लिए, क्या पूरा हो जाने से पहले MySQL autocommitting INSERT या UPDATE ऑपरेशन खत्म हो सकता है (अपडेट/अन्य लेनदेन के लिए दृश्य डालें)?

+0

क्या आप अपने इंजन के लिए InnoDB या MyISAM का उपयोग कर रहे हैं? – FlipperPA

+0

इनो डीबी। डिफ़ॉल्ट विन्यास के साथ डीबी अमेज़ॅन आरडीएस पर चल रहा है।कुछ बड़ी टेबल हैं, लेकिन इस समस्या से संबंधित तालिका छोटी है (128kb या तो के क्रम में) – jhonkola

+0

क्या आप इस मामले के लिए ऑटोोकॉमिट बंद कर सकते हैं? – sobolevn

उत्तर

0

यह निश्चित रूप से एक रेस स्थिति की तरह दिखता है।

आपके द्वारा वर्णित परिदृश्य कभी नहीं होना चाहिए यदि केवल एक स्क्रिप्ट और एक डेटाबेस है। जब आप() सहेजते हैं, तो विधि तब तक वापस नहीं आती जब तक डेटा वास्तव में डेटाबेस में नहीं आता है।

यदि आप मास्टर/गुलाम कॉन्फ़िगरेशन का उपयोग कर रहे हैं, तो आप प्रतिकृति विलंब का शिकार हो सकते हैं: यदि आप मास्टर पर लिखते हैं लेकिन दासों पर पढ़ते हैं, तो यह पूरी तरह से संभव है कि आपकी स्क्रिप्ट प्रतीक्षा न करे प्रतिकृति के लिए काफी देर तक, और मास्टर को दोहराने का अवसर मिलने से पहले आप दास से पुराने conf को पढ़ते हैं।

इस तरह की कॉन्फ़िगरेशन डेटाबेस राउटर का उपयोग करके डीजेंगो में स्थापित की जा सकती है, या इसे डीबी प्रॉक्सी का उपयोग करके डीबी पक्ष पर किया जा सकता है। उसकी जांच करो।

संबंधित मुद्दे