【问题标题】:Are locked records from Django select_for_update affected by updated values来自 Django select_for_update 的锁定记录是否受更新值的影响
【发布时间】:2020-08-29 17:43:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 同时避免多个问题,因为它违反了 SO 规则(额外的问题是它是否适用于 MySQL 以及是否有不同的解决方案)

标签: mysql django concurrency mysql-python isolation-level


【解决方案1】:

来自关于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()

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

【讨论】:

  • 谢谢,我明白互斥体行为是这样一个函数所期望的。但是,其他来源的“阻止记录”一词让我有点困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多