django如果条件独特

时间:2015-07-28 07:22:42

标签: django database

我有以下状态:

用户A“控制”资源R

我需要确保没有人可以访问R,直到ADMIN说

其o.k.使用它。

我现在拥有的:

当用户控制R i时,在DB中保存一个标志。 (该标志与

有关

R - 如果是True,那么R就被拿走了)

问题是,如果2个用户试图在同一秒获得R,则可以有

他们都得到R(因为线程时间)的情况。

我该如何预防?

1 个答案:

答案 0 :(得分:3)

没有任何代码示例,很难准确回答您的问题。

尽管如此,我认为你想要这样的事情:

num_updated = Resource.objects.filter(id=1, is_taken=False).update(is_taken=True)
was_taken = (num_updated == 1)

这将创建一个原子数据库查询。如果is_takenFalse,则它将设置为True,返回值将为1.如果资源已被占用,则没有行匹配且返回值将为0

这应该没有竞争条件(至少,它将使用默认的 Read Committed 隔离级别在PostgreSQL中。)