gpt4 book ai didi

ruby-on-rails - SHARE 锁定记录的行为,为什么聚合函数不可能?

转载 作者:行者123 更新时间:2023-11-29 13:08:06 27 4
gpt4 key购买 nike

关于上一个question ,我询问了如何从 SELECT 中排除用 UPDATE 锁锁定的记录。

对我来说,用 SHARE LOCK 锁定的记录不可能进行聚合函数。

为什么会这样,我该如何绕过这个问题?


我正在做的过程:

  1. 使用 UPDATE 锁锁定队列中要删除的记录
  2. 要为用户排除该记录,在 SELECT set SHARE lock 上将与执行 UPDATE lock 发生冲突,并过滤该记录
  3. 对所选记录进行分页(正在使用 COUNT())

我唯一的选择是在 dB/Redis 中设置标志来过滤该记录吗?


我得到的错误:

PG::FeatureNotSupported: ERROR:  FOR SHARE is not allowed with aggregate functions
: SELECT COUNT(*) FROM "groups" WHERE (groups.deleted_at IS NULL) FOR SHARE OF groups SKIP LOCKED

最佳答案

子选择可以帮助您:

SELECT COUNT(*)
FROM (SELECT 1
FROM groups
WHERE groups.deleted_at IS NULL
FOR SHARE SKIP LOCKED) AS q;

这样做的原因是锁定行的查询必须能够从结果中识别出要锁定的行。

src/backend/optimizer/plan/planner.c 有这段代码注释:

/*
* We've got trouble if FOR [KEY] UPDATE/SHARE appears inside
* grouping, since grouping renders a reference to individual tuple
* CTIDs invalid. This is also checked at parse time, but that's
* insufficient because of rule substitution, query pullup, etc.
*/

因此可以说这是实现方式所必需的。

关于ruby-on-rails - SHARE 锁定记录的行为,为什么聚合函数不可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com