【问题标题】:Python's MySqlDB not getting updated rowPython MySqlDB 没有得到更新的行
【发布时间】:2009-10-24 10:43:14
【问题描述】:

我有一个脚本等待数据库中的某些行被更新:

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 上设置的。

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    这是一个 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

    【讨论】:

    • 这是一个 InnoDB。但是python脚本只查询表。对表的更新由 tomcat webapp 执行,使用 JDBC, 在自动提交时设置。
    • 我添加了更多细节来解释行为
    【解决方案2】:

    我通过运行解决了这个问题

    c.execute("""set session transaction isolation level READ COMMITTED""")
    

    在我阅读课程的早期。现在确实有来自其他线程的更新。

    在我的例子中,我长时间保持连接打开(在 mod_python 内部),因此根本看不到其他进程的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-16
      • 2017-11-25
      • 2013-08-17
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多