2013-11-21 23 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 

无论这种解决方案是更好将取决于使用的情况下,虽然。