web2py 任务(调度程序)可以与 web2py 操作有竞争条件吗?

Can web2py tasks(scheduler) have a race condition with web2py actions?

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

来自docs

Remember to call db.commit() at the end of every task if it involves inserts/updates to the database. web2py commits by default at the end of a successful action but the scheduler tasks are not actions.

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

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)

这会造成竞争条件吗?如果是这样,最好的修复方法是什么?

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