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?或者对于并发查询有不同的解决方案吗?
通常,如果另一个事务已经获取了所选行之一的锁,则查询将阻塞,直到锁被释放。如果这不是您想要的行为,请调用 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 ),因为该特定线程等待在数据库上查询
| 归档时间: |
|
| 查看次数: |
4259 次 |
| 最近记录: |