我有一个脚本,它会一直等到数据库中的某一行被更新:
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执行的,这是在自动提交时设置的。
发布于 2009-10-24 18:56:58
这是一个InnoDB表,对吗?InnoDB是事务性存储引擎。将自动提交设置为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
发布于 2011-10-06 22:10:39
我通过运行以下命令解决了这个问题
c.execute("""set session transaction isolation level READ COMMITTED""")在我的阅读课程的早期。来自其他线程的更新现在可以通过了。
在我的实例中,我在很长一段时间内(在mod_python内部)保持连接开放,所以根本看不到其他进程的更新。
https://stackoverflow.com/questions/1617637
复制相似问题