0

我有以下问题,使用 SQLALchemy 0.7.8、Flask-SQLAlchemy 0.16 和 MySQL 5.5。

我有一个在服务器 A 上运行的 cron 脚本,它查询表 T 以获取与特定状态匹配的所有行的 id,将这些 id 发送到代理,该代理将其分发给许多其他机器上的工作人员。

工作人员获取 id,查询该表 T 和其他一些表的数据,更新表以将该 id 标记为正在处理,提交事务,并通过 REST API 将这些发送到服务器 X。

一旦服务器 X 完成工作,它会将结果发送到另一个服务器 Y 的另一个 REST API 中的回调。服务器 Y 进行一些处理并将结果保存回表 T。提交之后,它将 id 发送给另一个worker,这可能是在第一步得到它的那个人,并且那个worker现在应该获取一些其他数据并发送回另一个服务,但是它不会在这一步做任何更新。

问题是,在最后一步,worker 没有通过回调获取服务器 Y 更新的数据,而是从更新之前获取数据。

我认为工作人员仍然在它用来首先将数据发送到服务器 X 的会话上,并且没有刷新,因为在它与下一次查询数据之间没有发生提交或回滚,当服务器 Y 被回调时。

在这种情况下,适当的解决方案是什么?到目前为止,我尝试在任务开始时调用 session.commit(),在工作人员查询数据之前,它似乎正在工作,但我对此不太确定。

4

2 回答 2

0

这个问题的讨论发生在https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/yXSroyVNKYM

于 2013-01-26T02:10:34.230 回答
0

问题是长时间运行的事务,虽然它可以通过管理会话而不是使用 Flask 全局 db.session 来解决,但在 Flask-SQLAlchemy 下执行此操作的正确方法是为每个任务调用创建一个新上下文。

所以,而不是:

def task(args):
    session = Session(engine)
    try:
       ... do stuff here
        session.commit()
    finally:
        session.close() 

它只需要:

def task(args):
    with app.app_context():
        ... do stuff here

相关讨论: https ://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/yXSroyVNKYM

于 2013-01-26T15:08:44.470 回答