2009-10-24 68 views
11

我有等待,直到在一個數據庫中某行被更新的腳本:Python的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"

有沒有設置我沒有設置?

編輯:python腳本只查詢表。表的更新由使用JDBC的tomcat web應用程序執行,該應用程序在autocommit上設置。

回答

17

這是一個InnoDB表,對吧? InnoDB是事務性存儲引擎。將autocommit設置爲true可能會爲您解決此問題。

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。但python腳本只查詢表格。表的更新由使用JDBC的tomcat web應用程序執行,該應用程序*設置爲autocommit。 – olamundo 2009-10-24 11:05:04

+0

我添加了更多細節來解釋行爲 – 2009-10-24 11:08:12

3

我工作圍繞這在我的閱讀會話中運行

c.execute("""set session transaction isolation level READ COMMITTED""") 

早期。其他線程的更新現在已經完成。

在我的例子中,我一直保持連接很長一段時間(在mod_python中),所以其他進程的更新根本看不到。