我觉得我对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秒。
我没有得到什么?