数据库记录使用django插入竞争条件

时间:2013-03-11 17:51:40

标签: mysql sql database django race-condition

我正在尝试使用django实现最大大小的列表。例如,我有一个这样的模型:

class RecentView(models.Model):
    member = models.ForeignKey(Member)
    product = models.ForeignKey(Product)
    view_time = models.DateTimeField(auto_now=True, auto_now_add=True)
    class Meta:
        unique_together = ('member', 'product')

基本上我保留了会员最近查看的产品列表。我想将每个成员的记录数量限制在X内。换句话说,只保留成员查看过的最新X数量的产品。因此,在新插入期间,如果该成员已有X条记录,则最新条目应覆盖最旧条目以保持该成员的记录总数= X.在我的视图中,我当前执行查询以首先获取记录数:

num_views = RecentView.objects.filter(member_id=<some_mid>).count()

然后我继续逻辑:

if num_views >= X:
    # Do not call create(), but instead issue another query to grab the oldest record and then update it
    ....
else:
    view = RecentView.objects.create(member_id=<some_mid>, product_id=<some_pid>)

如果同时调用此代码,则此代码将失败,因为此函数不是原子函数。我不知道如何使用数据库锁来执行此操作,因为我没有锁定单个记录,并且锁定整个表似乎不必要地浪费,因为这只会影响单个成员。

对我而言,这应该是一种常见的情况,但由于某些原因,我找不到有类似问题的人。有人能指出我如何解决这个问题的正确方向吗?

谢谢! 约翰

0 个答案:

没有答案