如何原子地从数据库中选择一个元素?

时间:2014-11-03 14:42:11

标签: python django transactions

我有一个简单模型的Django应用程序:

class ThingToPick(models.Model):
    title = models.CharField(max_length=200)
    start_date = models.DateTimeField('date published', auto_now=True)
    status = models.IntegerField(default=0)
    filedata = models.TextField() 

我有一些观点:

    exec_item = ThingToRun.objects.filter(status=0).order_by('start_date')[0]
    exec_item.status = 1
    exec_item.save()

我需要一些方法从一个且只有一个并发用户中选择每个ThingToRun。我知道这已经破了,我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

你真正想要做的不仅仅是挑选一些东西,而是选择一些东西并将其标记为正在处理中,以便在此期间没有其他人选择它。所以你想要的方法是select_for_update

exec_item = ThingToRun.objects.select_for_update().filter(status=0).order_by('start_date')[0]
exec_item.status = 1
exec_item.save()
...process exec_item ....