Python的MySqlDB未获得更新行

时间:2009-10-24 10:43:14

标签: python mysql

我有一个脚本,等待更新数据库中的某行:

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脚本只查询表。表的更新由tomcat webapp执行,使用JDBC,在autocommit上设置。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

我通过运行

解决了这个问题
c.execute("""set session transaction isolation level READ COMMITTED""")

在我的阅读课程的早期。来自其他线程的更新现在已经过了。

在我的实例中,我保持连接打开很长时间(在mod_python中),因此根本没有看到其他进程的更新。