我正在运行一个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)
这会造成竞争条件吗?如果是这样,解决它的最佳方法是什么呢?
答案 0 :(得分:1)
scheduler.queue_task
执行插入操作,但它与上一行中的插入操作属于同一事务的一部分,因此两个插入都将同时提交。因此,在提交初始插入之前,不应该处理任务。