我有以下状态:
用户A“控制”资源R
我需要确保没有人可以访问R,直到ADMIN说
其o.k.使用它。
我现在拥有的:
当用户控制R i时,在DB中保存一个标志。 (该标志与
有关R - 如果是True,那么R就被拿走了)
问题是,如果2个用户试图在同一秒获得R,则可以有
他们都得到R(因为线程时间)的情况。
我该如何预防?
答案 0 :(得分:3)
没有任何代码示例,很难准确回答您的问题。
尽管如此,我认为你想要这样的事情:
num_updated = Resource.objects.filter(id=1, is_taken=False).update(is_taken=True)
was_taken = (num_updated == 1)
这将创建一个原子数据库查询。如果is_taken
为False
,则它将设置为True
,返回值将为1.如果资源已被占用,则没有行匹配且返回值将为0
这应该没有竞争条件(至少,它将使用默认的 Read Committed 隔离级别在PostgreSQL中。)