我有一个脚本,它等待直到数据库中的某些行被更新:
con = MySQLdb.connect(server, user, pwd, db)
脚本启动时,该行的值为"running",并等待该值变为"finished"
"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 Web应用程序使用JDBC进行,该应用程序是在自动提交时设置的。
这是一个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