Python的MySQLdb的不会得到更新
问题描述:
行
我有等待,直到在一个数据库中某行被更新的脚本: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上设置。
答
这是一个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
答
我工作围绕这在我的阅读会话中运行
c.execute("""set session transaction isolation level READ COMMITTED""")
早期。其他线程的更新现在已经完成。
在我的例子中,我一直保持连接很长一段时间(在mod_python中),所以其他进程的更新根本看不到。
这是一个InnoDB。但python脚本只查询表格。表的更新由使用JDBC的tomcat web应用程序执行,该应用程序*设置为autocommit。 – olamundo 2009-10-24 11:05:04
我添加了更多细节来解释行为 – 2009-10-24 11:08:12