Sqlalchemy 在多处理环境中获取过时结果

Sqlalchemy 在多处理环境中获取过时结果,sqlalchemy,Sqlalchemy,在我的应用程序中,我通过多处理使用两个独立的进程。两者都可以通过sqlalchemy核心(而不是ORM)访问MySQL数据库。一个进程从各种来源读取数据并将其写入数据库。另一个进程只是从数据库中读取数据 我有一个查询,它从a表中获取最新记录并显示id。但是它总是显示启动程序时创建的第一个id,而不是最新插入的id(每隔几秒钟创建一个新行) 如果我使用单独的MySQL工具并手动运行查询,我会得到正确的结果,但SQL alchemy总是给我陈旧的结果。假设您正在使用连接上的数据,那么只要您保持当前事

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

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


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

假设您正在使用连接上的数据,那么只要您保持当前事务运行,或者直到您提交另一个事务,就会显示“陈旧”。为了让一个进程看到另一个进程的数据,需要做两件事:1。创建新数据的事务需要提交和2。当前事务(假设它已经读取了一些数据)需要回滚或提交并重新启动。请参阅。

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

InnoDB向您显示启动事务时数据库的状态。您正在使用的任何其他工具都可能启用了自动提交功能,其中在每个查询之后隐式启动新事务

要查看SQLAlchemy中的更改,请按照zzzeek的建议执行,并更改您的监视/读取过程以开始新的事务

我自己使用的一种技术是在查询的执行选项中添加autocommit=True,例如:

结果=conn.execute(选择([table])。其中(table.c.id==123)。执行选项(autocommit=True))