某些进程同时读取表。每个过程都承担一项任务。在这种情况下是否可以不使用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()
答案 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
此解决方案是否更好将取决于用例。