2013-11-21 25 views
0

某些進程同時讀取表。每個進程都承擔一項任務。在這種情況下是否可以使用LOCK表?如何在SqlAlchemy中同時獲取和刪除記錄?

db.session.execute('LOCK TABLE "Task"') 
query = db.session.query(models.Task).order_by(models.Task.ordr).limit(1) 
    for row in query: 
     task = row 
     db.session.delete(row) 
db.session.commit() 

回答

1

通過鎖定表您可以使用pessimistic方法來實現併發。

交替地,鎖定表的方式,你可以是optimistic關於事情正確的方法。如果提交失敗,我將包裝代碼來檢索要在繼續重試語句中處理的任務,以防止提交失敗,因爲某些其他進程已經刪除了此進程嘗試獲取的此任務。

事情是這樣的,也許:

def get_next_task(): 
    session = ... 
    task = None 
    while not(task): 
     try: 
      query = session.query(models.Task).order_by(models.Task.ordr).limit(1) 
       for row in query: 
        task = row 
        session.delete(row) 
      session.commit() 
      if not(task): 
       return # no more tasks found 
     except TODO_FIND_PROPER_EXCEPTION_TO_HANDLE as _exc: 
      pass # or log the statement 

    # maybe need to make_transient 
    return task 

無論這種解決方案是更好將取決於使用的情況下,雖然。