我有一个脚本,等待更新数据库中的某行:
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上设置。
答案 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中),因此根本没有看到其他进程的更新。