Django select_for_update 中的锁定记录是否受到更新值的影响

Moh*_*aba 4 mysql django concurrency mysql-python isolation-level

我知道如果我们有多个并发用户, select_for_update 会锁定正在查询的记录。但是否也影响对查询记录的评估。

例如,如果用户 A 和用户 B 基于单个布尔变量“Available”同时查询表“Jobs”。两个用户都想访问可用职位的记录(其中Available = True)。

用户 A 设法先排队,并且他正在访问的记录现在已为用户 B 锁定。

如果用户A将所有记录都更改为False,那么用户B是否不会获取任何记录?或者他是否获得与用户 A 相同的记录,但可用性等于 False?

另外, select_for_update() 是否适用于 MySQL?或者对于并发查询有不同的解决方案吗?

ikl*_*nac 6

来自有关select_for_update 的文档

通常,如果另一个事务已经获取了所选行之一的锁,则查询将阻塞,直到锁被释放。如果这不是您想要的行为,请调用 select_for_update(nowait=True)。这将使调用非阻塞。如果另一个事务已获取冲突锁,则在评估查询集时将引发 DatabaseError。您还可以使用 select_for_update(skip_locked=True) 来忽略锁定的行。nowait 和skip_locked 是互斥的,并且尝试在启用这两个选项的情况下调用select_for_update() 将导致ValueError。

这基本上意味着当时只有一个查询经过,当处理它时,另一个查询会轮到(互斥行为)

在你的例子中考虑例如

...filter(available=true).select_for_update()
Run Code Online (Sandbox Code Playgroud)

如果第一个更改记录,则其他请求将获得新状态(没有记录首先设置为 false ),因为该特定线程等待在数据库上查询