如何在SqlAlchemy中同时获取和删除记录?

时间:2013-11-21 06:51:30

标签: python sqlalchemy

某些进程同时读取表。每个过程都承担一项任务。在这种情况下是否可以不使用LOCK表?

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 个答案:

答案 0 :(得分: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

此解决方案是否更好将取决于用例。