我正在運行一個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)
這能創造一個競爭條件嗎?如果是的話,最好的解決辦法是什麼?
由於我編輯直接傳遞id,問題沒有再被觀察到。但是,我的主要問題仍然存在。如果我沒有在這一行中提交,那麼在這裏是否存在競爭條件:「#I已經在此處放置db.commit()進行了測試,問題仍然存在」,排隊的任務可能會在插入值之前在db中查找? –