2009-10-24 47 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中),所以其他进程的更新根本看不到。