即使在postgresql中有多个会话调用存储过程,也可以让存储过程逐个运行

即使在postgresql中有多个会话调用存储过程,也可以让存储过程逐个运行,postgresql,Postgresql,在postgresql中:多个会话希望从表中获取一条记录,但我们需要确保它们不会相互干扰。我可以使用消息队列实现这一点:将数据放入队列中,然后让每个会话从队列中获取数据。但它在postgresql中可行吗?因为SQL人员将更容易调用存储过程。有没有办法配置存储过程以避免并发调用,或者使用一些特殊的锁?我建议确保存储过程使用选择进行更新,这将防止多个事务访问表中的同一行 根据博士后文件: FOR UPDATE使SELECT语句检索到的行 已锁定,好像要更新。这可以防止它们被修改或删除 被其他事务删

在postgresql中:多个会话希望从表中获取一条记录,但我们需要确保它们不会相互干扰。我可以使用消息队列实现这一点:将数据放入队列中,然后让每个会话从队列中获取数据。但它在postgresql中可行吗?因为SQL人员将更容易调用存储过程。有没有办法配置存储过程以避免并发调用,或者使用一些特殊的锁?

我建议确保存储过程使用
选择进行更新
,这将防止多个事务访问表中的同一行

根据博士后文件:

FOR UPDATE使SELECT语句检索到的行 已锁定,好像要更新。这可以防止它们被修改或删除 被其他事务删除,直到当前事务结束。那个 是,尝试更新、删除、选择更新的其他事务, 选择“无密钥更新”,选择“共享”,或选择“密钥共享” 这些行将被阻止,直到当前事务结束。为 更新锁定模式也可以通过行上的任何删除以及 修改某些列上的值的更新。目前, 更新案例中考虑的列集是具有 可以在外键中使用的唯一索引(如此部分 不考虑索引和表达式索引),但这可能 未来的变化

更多信息


因此,您不会一次锁定表中的所有行(即,通过
选择
锁定所有记录),我建议您使用
按顺序
以一致的方式对表进行排序,然后执行
限制1
,以便只获取队列中的下一行。还添加一个检查特定列值的
WHERE
子句(即
已处理的
),然后在处理后将列设置为一个值,以防止
WHERE
子句拾取该列。

对您来说,“相互干扰”到底意味着什么?是的。或者,您可以
锁定表
,但由于锁升级,这很容易死锁。如果您关心的是在标记为已处理之前确保工作已完成,同时仍然保持并发性,那么您将需要一个真正可靠的任务队列。