私は外部ソースからWebhookによって呼び出される関数を持つweb2pyアプリケーションを実行しています。この関数はタスクをスケジュールし、webhookからのデータをdbに入れます。スケジュールするタスクもdbを更新します。私の仕事は失敗していないことに気付きましたが、dbはタスクによって正しく更新されていないようです。 docsからweb2pyのタスク(スケジューラ)にweb2pyの動作で競合状態がありますか?
:
は、それがデータベースに挿入/更新が含まれている場合、すべてのタスクの終了時に
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を直接渡すように編集して以来、問題は再確認されていません。しかし、私の主な質問はまだ立っています。この行でコミットしないと競合状態になります: "#ここでdb.commit()をテストしても問題は解決しない"とテストした場合、キューに入れられたタスクは値が挿入される前にDBを調べます? –