首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python的MySqlDB未更新行

问Python的MySqlDB未更新行
EN

Stack Overflow用户
提问于 2009-10-24 18:43:14
回答 2查看 5.2K关注 0票数 11

我有一个脚本,它会一直等到数据库中的某一行被更新:

代码语言:javascript
复制
con = MySQLdb.connect(server, user, pwd, db)

当脚本启动时,该行的值为"running",并等待该值变为"finished"

代码语言:javascript
复制
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执行的,这是在自动提交时设置的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-24 18:56:58

这是一个InnoDB表,对吗?InnoDB是事务性存储引擎。将自动提交设置为true可能会为您修复此行为。

代码语言:javascript
复制
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

票数 17
EN

Stack Overflow用户

发布于 2011-10-06 22:10:39

我通过运行以下命令解决了这个问题

代码语言:javascript
复制
c.execute("""set session transaction isolation level READ COMMITTED""")

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

在我的实例中,我在很长一段时间内(在mod_python内部)保持连接开放,所以根本看不到其他进程的更新。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1617637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档