为什么select_for_update在Django + Postgres中对我不起作用?

时间:2017-09-06 20:14:17

标签: python django postgresql

我觉得我对django中的'select_for_update'有一些概念上的错误理解。

让我们从一些简单的代码行开始

Rank is a Django model.
Report is a Django model, with a bunch of Rank's.  

像这样:

class Rank(models.Model):
    search_term = models.CharField()
    rank = models.IntegerField()
    created_on = models.DateTimeField()

class Report(models.Model):
    ranks = models.ManyToManyField('Rank')

足够简单。

我有一名工人,他的工作是根据搜索字词检查“排名”对象的最后一次独特迭代。因此,如果我们有一个搜索词'foo',foo就可以说12个条目。如果最后一个条目超过24小时,那么我们想要创建一个新条目以查看新排名。

到目前为止我?

好。所以,这就是问题发生的地方。显然,有超过1名工人。所以这就是我试图确保只写一条记录的方式:

with transaction.atomic():
    # hidden code.. select the max (created_on) model of unique search_term

    # loop through the maxes
    for r in ranks:
        if q['max_date'] <= one_day_ago:
            ids_we_need_to_update.append(q['rank_id'])

    rows_to_update = Rank.objects.select_for_update(skip_locked=True).filter(pk__in=ids_we_need_to_update)[:16]

    for rtu in rows_to_update:
        #update row....
        rtu.save()

令我失望的是,我今天早上醒来看到发生了竞争状况,并且相同的search_term被插入Rank数据库两次,相隔2秒。

我没有得到什么?

0 个答案:

没有答案