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

问题描述 投票:1回答:1

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

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

用户A先被排入队列,现在他为用户B锁定的访问记录已被锁定。

如果用户A将所有记录都更改为False,则用户B不会获得任何记录吗?还是他得到与用户A相同的记录,但Availability等于False?]

另外,select_for_update()是否可以与MySQL一起使用?还是对并发查询有不同的解决方案?

mysql django concurrency mysql-python isolation-level
1个回答
0
投票

摘自有关select_for_update的文档

通常,如果另一笔交易对以下其中一项进行了已获得锁定在选定的行中,查询将block,直到释放锁为止。如果这不是你想要的行为,打电话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()

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

© www.soinside.com 2019 - 2024. All rights reserved.