如何在 postgres 中使用“For update skip locked”而不锁定查询中使用的所有表中的行?

Rig*_*hto 6 postgresql row-level-security

当你想使用 postgres 的 SELECT FOR UPDATE SKIP LOCKED 功能来确保两个不同的用户从一个表中读取并声明任务不会被彼此阻止并且也不会被另一个用户读取任务时:

查询中正在使用连接来检索任务。除了包含主要信息的表之外,我们不希望任何其他表具有行级锁定。下面的示例查询 - 仅锁定表中的行 - 以下查询中的“任务”

SELECT v.someid , v.info,  v.parentinfo_id, v.stage  FROM task v, parentinfo pi  WHERE v.stage = 'READY_TASK' 
             AND v.parentinfo_id = pi.id 
             AND pi.important_info_number = ( 
             SELECT MAX(important_info_number) FROM parentinfo )
              ORDER BY v.id limit 200 for update skip locked;
Run Code Online (Sandbox Code Playgroud)

现在,如果用户 A 正在检索该表的大约 200 行,用户 B 应该能够检索另一组 200 行。

编辑:根据下面的评论,查询将更改为:

SELECT v.someid , v.info,  v.parentinfo_id, v.stage  FROM task v, parentinfo pi  WHERE v.stage = 'READY_TASK' 
             AND v.parentinfo_id = pi.id 
             AND pi.important_info_number = ( 
             SELECT MAX(important_info_number) FROM parentinfo)  ORDER BY v.id limit 200 for update of v skip locked;
Run Code Online (Sandbox Code Playgroud)

如何最好地按顺序排列行?虽然如果多个用户调用此命令会影响订单,但仍应维护正在返回的行的某些订单神圣性。

此外,这是否也确保调用相同选择查询的多个线程将检索不同的行集,还是仅对更新命令进行锁定?

Rig*_*hto 1

只是对此进行了一些尝试 - 多个选择查询最终将检索不同的行集。另外,order by 保证了最终得到的结果的顺序。