web2py任务(调度程序)是否具有web2py操作的竞争条件?

时间:2016-11-23 18:50:30

标签: python postgresql web2py

我正在运行一个web2py应用程序,该应用程序具有一个由来自外部源的webhook调用的函数。该函数调度任务并将来自webhook的数据放入我的数据库中。它安排的任务也会更新数据库。我注意到我的任务都没有失败,但任务似乎没有正确更新数据库。

来自docs

  

如果涉及对数据库的插入/更新,请记住在每个任务结束时调用db.commit()。默认情况下,web2py会在成功操作结束时提交,但调度程序任务不是操作。

我的代码大致有以下形式,我想知道这是否会产生竞争条件或第一次插入是否立即发生:

def receive_webhook():
  def POST(*args, **vars):
    inserted_id = db.webhook_table.insert(webhook_data=data, status=0)
    #I have tested with putting a db.commit() here and problem still persists
    scheduler.queue_task(process_update,pvars={'inserted_id': inserted_id})
    #....some other code happens after this

我的Scheduler.py中的代码:

 def process_update(inserted_id):
        import json
        record = db(db.webhook_table.id == inserted_id).select().as_list()
        # CAN THIS SELECT FINISH BEFORE THE INSERT FROM receive_webhook IS RECORDED IN THE DB OR IS THE INSERT FINISHED IMMEDIATEDLY
        state = json.loads(record[0]['webhook_data'])['status']
        if not state == 'Updated':
            db(db.webhook_table.id == inserted_id).update(status=2)
        db.commit()
    from gluon.scheduler import Scheduler
    scheduler = Scheduler(db)

这会造成竞争条件吗?如果是这样,解决它的最佳方法是什么呢?

1 个答案:

答案 0 :(得分:1)

scheduler.queue_task执行插入操作,但它与上一行中的插入操作属于同一事务的一部分,因此两个插入都将同时提交。因此,在提交初始插入之前,不应该处理任务。