Python Django创建重复的跟随关系--在表中创建新数据时怀疑并发问题

Python Django创建重复的跟随关系--在表中创建新数据时怀疑并发问题,python,mysql,django,concurrency,Python,Mysql,Django,Concurrency,让我解释一下我的具体情况: 企业可以选择他们所在的社区,此选项将保留到DB,保存此对象时会触发信号。一个方法监听这个信号,并且应该只更新一次跟随这个邻居的所有其他用户。此方法中会进行一项检查,尝试验证是否有任何其他用户已经关注此业务,对于每个不关注此业务但关注此邻居的用户,将在db中创建一个关注关系。一切都应该很好,如果用户已经在关注此业务,则不会设置任何关系 但有时会发生两个或多个事务同时发生,所有事务都会检查用户是否在关注此业务,当然,因为没有一个事务可以看到用户和业务之间的跟踪关系,所以现

让我解释一下我的具体情况:

企业可以选择他们所在的社区,此选项将保留到DB,保存此对象时会触发信号。一个方法监听这个信号,并且应该只更新一次跟随这个邻居的所有其他用户。此方法中会进行一项检查,尝试验证是否有任何其他用户已经关注此业务,对于每个不关注此业务但关注此邻居的用户,将在db中创建一个关注关系。一切都应该很好,如果用户已经在关注此业务,则不会设置任何关系

但有时会发生两个或多个事务同时发生,所有事务都会检查用户是否在关注此业务,当然,因为没有一个事务可以看到用户和业务之间的跟踪关系,所以现在建立了多个跟踪关系

我试图确保信号没有被发送多次,但我不确定为什么这些多个事务同时发生

虽然我已经找到了一些在尝试避免更新并发性问题时执行行锁定的方法,但我不知道如何确保只进行一次插入

表锁定是确保某种插入发生的唯一方法吗

# when a business updates their neighborhood, this sets the follow relationship

def follow_biz(sender, instance, created, **kwargs):

    if instance.neighborhood:
        neighborhood_followers = FollowNeighborhood.objects.filter(neighborhood=instance.neighborhood)
        # print 'INSTANCE Neighborhood %s ' % instance.neighborhood
        for follower in neighborhood_followers:

            if not Follow.objects.filter(user=follower.user, business=instance).count():
                follow = Follow(business=instance, user=follower.user)
                follow.save()

# a unique static string to prevent signal from being called twice
follow_biz_signal_uid = hashlib.sha224("follow_biz").hexdigest()

# signal
post_save.connect(follow_biz, sender=Business, dispatch_uid=follow_biz_signal_uid)

通过使用对相关列的约束来确保数据库级别行的唯一性[1],Django、AFAICT将做正确的事情,并根据需要插入或更新

在这种情况下,约束应该在用户和业务id上


[1] 当然,在适用的情况下确保唯一性始终是一个好主意。

不能使用无唯一性约束,我应该清楚地说明这一点,因为同一个业务可以遵循多次,同一个用户可以遵循多个业务。。。他们只是不应该多次关注同一个业务。我正在看这个片段,最终的答案是对用户id做一个独特的约束,业务id试图使用您的发现改进答案,并试图将其作为一般性的内容提供给其他读者。