【发布时间】:2018-07-20 00:26:37
【问题描述】:
我的表包含并发工作人员的“任务”。所以工人应该能够从表中“获取”任务,这意味着原子地检查任务是否存在,如果存在,删除它。其他工作人员应该被锁定,直到这个原子过程完成。如何在 Django 中执行这种锁定?
我正在使用如下代码,但是行没有锁定读取,两个并发工作者都进入事务,找到相同的任务,一个成功获得它,但第二个得到OperationalError('database is locked',)
使用SQLite
class Task(models.Model):
@staticmethod
def get():
with transaction.atomic():
task = Task.objects.select_for_update().filter(...).first()
if task:
task.delete()
return task
return None
【问题讨论】:
-
锁错误的worker应该一直尝试直到拥有事务锁的worker完成。最终它会获得写锁并做它的事情。
标签: django database sqlite locking