2016-11-23 4 views
0

私は外部ソースから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) 

これは競合状態を作りますか?もしそうなら、それを修正する最良の方法は何でできないのですか?

+0

IDを直接渡すように編集して以来、問題は再確認されていません。しかし、私の主な質問はまだ立っています。この行でコミットしないと競合状態になります: "#ここでdb.commit()をテストしても問題は解決しない"とテストした場合、キューに入れられたタスクは値が挿入される前にDBを調べます? –

答えて

1

scheduler.queue_taskは、前の行の挿入と同じトランザクションの一部であるため、両方の挿入が同時にコミットされます。したがって、最初の挿入がコミットされる前にタスクを処理することはできません。

+0

ありがとう、それは私が知る必要があったことです –

+0

この同じ静脈で、いずれかが失敗した場合、両方が失敗するはずですか?また、私は次のコメントを置いた行に 'db.commit()'を置いてはいけません: "#ここにdb.commit()を置いてテストしましたが、問題は残っています"同じ取引のですか? –

+0

はい、両方のカウントで正しくあります。 – Anthony

関連する問題