2009-10-24 13 views
11

हो रही मैं एक स्क्रिप्ट जब तक एक DB में कुछ पंक्ति अद्यतन किया जाता है इंतजार कर रहा है कि है:पायथन के MySqlDB नहीं अद्यतन पंक्ति

con = MySQLdb.connect(server, user, pwd, db) 

स्क्रिप्ट शुरू होता है पंक्ति के मूल्य "running" है, और यह इंतजार कर रहा है मूल्य "finished" बनने के लिए

while(True): 
    sql = '''select value from table where some_condition''' 
    cur = self.getCursor() 
    cur.execute(sql) 
    r = cur.fetchone() 
    cur.close() 
    res = r['value'] 
    if res == 'finished': 
     break 
    print res 
    time.sleep(5) 

जब मैं इस स्क्रिप्ट को चलाता हूं तो यह हमेशा के लिए लटकता है। हालांकि जब मैं तालिका से पूछता हूं, तो पंक्ति के मान को "finished" में बदल दिया गया है, फिर भी स्क्रिप्ट का प्रिंटआउट अभी भी "running" है।

क्या ऐसी कोई सेटिंग है जिसे मैंने सेट नहीं किया है?

संपादित करें: पायथन स्क्रिप्ट केवल तालिका से पूछताछ करता है। तालिका में अपडेट जेएमबीसी का उपयोग करके टॉमकैट वेबपैप द्वारा किया जाता है, जो ऑटोोकॉमिट पर सेट होता है।

उत्तर

17

यह एक InnoDB तालिका है, है ना? InnoDB लेनदेन भंडारण इंजन है। ऑटोकॉमिट को सत्य पर सेट करना शायद आपके लिए इस व्यवहार को ठीक करेगा।

conn.autocommit(True) 

वैकल्पिक रूप से, आप लेनदेन अलगाव स्तर बदल सकते हैं। आप यहां इसके बारे में अधिक पढ़ सकते हैं: http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

इस व्यवहार का कारण यह है कि एक ही लेनदेन के अंदर पढ़ने को सुसंगत होने की आवश्यकता होती है। सभी लेनदेन के भीतर सभी लगातार पढ़ते हैं, पहले पढ़ने के द्वारा स्थापित स्नैपशॉट पढ़ें। यहां तक ​​कि यदि आप स्क्रिप्ट केवल तालिका पढ़ते हैं तो इसे लेनदेन भी माना जाता है। यह InnoDB में डिफ़ॉल्ट व्यवहार है और आपको इसे पढ़ने या प्रत्येक पढ़ने के बाद conn.commit() को चलाने की आवश्यकता है।

यह पृष्ठ अधिक जानकारी के में यह बताते हैं: http://dev.mysql.com/doc/refman/5.0/en/innodb-consistent-read.html

+0

यह एक InnoDB है। लेकिन पायथन लिपि केवल तालिका से पूछताछ करता है। टेबल पर अपडेट जेडीबीसी का उपयोग करके टॉमकैट वेबपैप द्वारा किया जाता है, जो * ऑटोकॉमिट पर सेट है। – olamundo

+0

मैंने व्यवहार की व्याख्या करने के लिए और विवरण जोड़े –

3

मैं

c.execute("""set session transaction isolation level READ COMMITTED""") 
जल्दी पर

चल मेरे पढ़ने सत्र में से इस के आसपास काम किया। अन्य धागे से अपडेट अब आते हैं।

मेरे उदाहरण में मैं लंबे समय तक कनेक्शन खोल रहा था (mod_python के अंदर) और इसलिए अन्य प्रक्रियाओं के अपडेट बिल्कुल नहीं देखे जा रहे थे।

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