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

时间:2017-07-16 18:14:18

标签: postgresql row-level-security

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

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

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;

现在,如果用户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;

如何最好地按顺序下订单?如果多个用户调用此命令,订单将受到影响,但仍应保留正在返回的行的一些订单神圣性。

另外,这是否也确保调用相同select查询的多个线程将检索不同的行集,或者仅对更新命令执行锁定?

1 个答案:

答案 0 :(得分:0)

稍微尝试一下 - 多个选择查询将最终检索不同的行集。此外,order by确保获得最终结果的顺序。