2016-11-23 73 views
0

我正在運行一個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) 

這能創造一個競爭條件嗎?如果是的話,最好的解決辦法是什麼?

+0

由於我編輯直接傳遞id,問題沒有再被觀察到。但是,我的主要問題仍然存在。如果我沒有在這一行中提交,那麼在這裏是否存在競爭條件:「#I已經在此處放置db.commit()進行了測試,問題仍然存在」,排隊的任務可能會在插入值之前在db中查找? –

回答

1

scheduler.queue_task做了一個插入操作,但它與前一行的插入操作是同一事務的一部分,所以兩個插入操作都將同時提交。因此,在提交初始插入之前,不應該可以處理該任務。

+0

謝謝,這就是我需要知道的 –

+0

在這同樣的情況下,如果一個失敗都應該失敗,對嗎?另外,我不應該在該行放置'db.commit()',我已經放置了以下注釋:「#I已經在此處放置了一個db.commit()進行了測試,問題仍然存在」,如果我希望它們成爲同一筆交易? –

+0

是的,這兩個都是正確的。 – Anthony