मुझे अपने पायथन/wsgi वेब ऐप में सत्रों में कोई समस्या है। 2 wsgi डिमन प्रक्रियाओं में से प्रत्येक में प्रत्येक थ्रेड के लिए एक अलग, लगातार mysqldb कनेक्शन है। कभी-कभी, पुराने सत्रों को हटाने और एक नया निर्माण करने के बाद, कुछ कनेक्शन अभी भी पुराने सत्रों को एक चयन में लाते हैं, जिसका अर्थ है कि वे सत्र को सत्यापित करने में विफल रहते हैं और फिर से लॉगिन करने के लिए कहते हैं।कुछ mysql कनेक्शन क्यों हटाए जाने के बाद mysql डेटाबेस पुराने डेटा का चयन कर रहे हैं?
विवरण: सत्र एक स्थानीय mysql डेटाबेस में एक InnoDB तालिका में संग्रहीत हैं। प्रमाणीकरण के बाद (सीएएस के माध्यम से), मैं उस उपयोगकर्ता के लिए पिछले सत्र हटा देता हूं, एक नया सत्र (एक पंक्ति डालें), लेनदेन प्रतिबद्ध करता हूं, और कुकी में नए सत्र आईडी के साथ मूल रूप से अनुरोधित पृष्ठ पर रीडायरेक्ट करता हूं। प्रत्येक अनुरोध के लिए, डेटाबेस में सत्रों के विरुद्ध कुकी में एक सत्र आईडी की जांच की जाती है।
कभी-कभी, पुनर्निर्देशित होने के बाद डेटाबेस में एक नव निर्मित सत्र नहीं मिलता है। इसके बजाए, उस उपयोगकर्ता के लिए पुराना सत्र अभी भी है। (मैंने प्रत्येक अनुरोध की शुरुआत में सभी सत्रों को चुनकर और लॉग इन करके इसे चेक किया)। किसी भी तरह, मुझे कैश किए गए परिणाम मिल रहे हैं। मैंने SQL_NO_CACHE के साथ सत्रों का चयन करने का प्रयास किया, लेकिन इससे कोई फर्क नहीं पड़ता।
मुझे कैश किए गए परिणाम क्यों मिल रहे हैं? कैशिंग कहाँ और हो सकती है, और इसे कैसे रोक सकता है या कैश रीफ्रेश कर सकता है? असल में, अन्य कनेक्शन नए डाले गए डेटा को देखने में विफल क्यों होते हैं?
मैं सम्मिलित करने के बाद प्रतिबद्ध हूं (ऊपर संपादित)। क्या आपका मतलब है कि मुझे अन्य कनेक्शनों में भी प्रतिबद्ध या रोलबैक करना चाहिए? – jmilloy
हां, आपको * अन्य * सत्र (या अलगाव स्तर को बदलने) के लेनदेन को समाप्त करने की आवश्यकता है –
ग्रेट, मैंने प्रत्येक अनुरोध की शुरुआत में एक प्रतिबद्धता जोड़ा, और ऐसा लगता है कि ऐसा लगता है। हो सकता है कि अंत में ऐसा करना बेहतर हो, लेकिन किसी भी मामले में ... यदि मैं इसे एक या दो दिन तक रखता हूं तो मैं इसे सही के रूप में चिह्नित करने के लिए वापस आऊंगा। – jmilloy