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

问题描述:

我正在运行一个web2py应用程序,它具有一个由外部源webhook调用的函数。该函数调度一项任务,并将来自webhook的数据放入我的数据库中。它计划的任务也会更新数据库。我注意到我的任务都没有失败,但数据库似乎没有被任务正确更新。web2py任务(调度程序)可以与web2py操作竞争吗?

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) 

这能创造一个竞争条件吗?如果是的话,最好的解决办法是什么?

+0

由于我编辑直接传递id,问题没有再被观察到。但是,我的主要问题仍然存在。如果我没有在这一行中提交,那么在这里是否存在竞争条件:“#I已经在此处放置db.commit()进行了测试,问题仍然存在”,排队的任务可能会在插入值之前在db中查找? –

scheduler.queue_task做了一个插入操作,但它与前一行的插入操作是同一事务的一部分,所以两个插入操作都将同时提交。因此,在提交初始插入之前,不应该可以处理该任务。

+0

谢谢,这就是我需要知道的 –

+0

在这同样的情况下,如果一个失败都应该失败,对吗?另外,我不应该在该行放置'db.commit()',我已经放置了以下注释:“#I已经在此处放置了一个db.commit()进行了测试,问题仍然存在”,如果我希望它们成为同一笔交易? –

+0

是的,这两个都是正确的。 – Anthony