【问题标题】:Getting stale results in multiprocessing environment在多处理环境中获得陈旧的结果
【发布时间】:2013-12-05 10:30:14
【问题描述】:

我在我的应用程序中通过多处理使用 2 个单独的进程。两者都可以通过 sqlalchemy 核心(不是 ORM)访问 MySQL 数据库。一个进程从各种来源读取数据并将其写入数据库。另一个进程只是从数据库中读取数据。

我有一个查询,它从表中获取最新记录并显示 id。但是,它总是显示我启动程序时创建的第一个 id,而不是最新插入的 id(每隔几秒创建新行)。

如果我使用单独的 MySQL 工具并手动运行查询,我会得到正确的结果,但 SQL alchemy 总是给我陈旧的结果。

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    由于您可以看到您的写入器进程正在使用另一个 MySQL 工具进行的更改,这意味着您的写入器进程确实在提交数据(至少,如果您使用的是 InnoDB,它会这样做)。

    InnoDB 向您显示数据库在您开始事务时的状态。无论您使用什么其他工具,都可能开启了自动提交功能,在每次查询之后都会隐式启动新事务。

    按照 zzzeek 的建议查看 SQLAlchemy 中的更改并更改您的监视/读取器进程以开始新事务。

    我自己用来执行此操作的一种技术是将 autocommit=True 添加到我的查询的 execution_options 中,例如:

    result = conn.execute(select([table]).where(table.c.id == 123).execution_options(autocommit=True))

    【讨论】:

      【解决方案2】:

      假设您正在使用innodb,只要您保持当前事务运行,或者直到您提交另一个事务,您的连接上的数据就会显示为“陈旧”。为了让一个进程能够看到另一个进程的数据,需要做两件事:1. 需要提交创建新数据的事务,以及 2. 当前事务,假设它已经读取了一些数据,需要回滚或提交并重新开始。见The InnoDB Transaction Model and Locking

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 2011-08-22
        • 2017-05-08
        • 2019-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多