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
执行插入,但它与上一行中的插入属于同一事务的一部分,因此两个插入将同时提交。因此,在提交初始插入之前,应该不可能处理任务。
我是 运行 一个 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
执行插入,但它与上一行中的插入属于同一事务的一部分,因此两个插入将同时提交。因此,在提交初始插入之前,应该不可能处理任务。