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)
这能创造一个竞争条件吗?如果是的话,最好的解决办法是什么?
scheduler.queue_task
做了一个插入操作,但它与前一行的插入操作是同一事务的一部分,所以两个插入操作都将同时提交。因此,在提交初始插入之前,不应该可以处理该任务。
谢谢,这就是我需要知道的 –
在这同样的情况下,如果一个失败都应该失败,对吗?另外,我不应该在该行放置'db.commit()',我已经放置了以下注释:“#I已经在此处放置了一个db.commit()进行了测试,问题仍然存在”,如果我希望它们成为同一笔交易? –
是的,这两个都是正确的。 – Anthony
由于我编辑直接传递id,问题没有再被观察到。但是,我的主要问题仍然存在。如果我没有在这一行中提交,那么在这里是否存在竞争条件:“#I已经在此处放置db.commit()进行了测试,问题仍然存在”,排队的任务可能会在插入值之前在db中查找? –