在多处理环境中获得陈旧的结果

时间:2013-12-02 18:14:12

标签: sqlalchemy

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

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

如果我使用单独的MySQL工具并手动运行查询,我会得到正确的结果,但SQL炼金术总是给我过时的结果。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

因为你可以看到你的编写器进程正在使用另一个MySQL工具进行的更改,这意味着你的编写器进程确实提交了数据(至少,如果你使用的是InnoDB)。

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

要查看SQLAlchemy中的更改,请执行zzzeek建议并更改监控/读取器进程以开始新事务。

我自己习惯使用的一种技术是将autocommit = True添加到我的查询的execution_options中,例如:

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