即使在postgresql中有多个会话调用存储过程,也可以让存储过程逐个运行
在postgresql中:多个会话希望从表中获取一条记录,但我们需要确保它们不会相互干扰。我可以使用消息队列实现这一点:将数据放入队列中,然后让每个会话从队列中获取数据。但它在postgresql中可行吗?因为SQL人员将更容易调用存储过程。有没有办法配置存储过程以避免并发调用,或者使用一些特殊的锁?我建议确保存储过程使用即使在postgresql中有多个会话调用存储过程,也可以让存储过程逐个运行,postgresql,Postgresql,在postgresql中:多个会话希望从表中获取一条记录,但我们需要确保它们不会相互干扰。我可以使用消息队列实现这一点:将数据放入队列中,然后让每个会话从队列中获取数据。但它在postgresql中可行吗?因为SQL人员将更容易调用存储过程。有没有办法配置存储过程以避免并发调用,或者使用一些特殊的锁?我建议确保存储过程使用选择进行更新,这将防止多个事务访问表中的同一行 根据博士后文件: FOR UPDATE使SELECT语句检索到的行 已锁定,好像要更新。这可以防止它们被修改或删除 被其他事务删
选择进行更新
,这将防止多个事务访问表中的同一行
根据博士后文件:
FOR UPDATE使SELECT语句检索到的行
已锁定,好像要更新。这可以防止它们被修改或删除
被其他事务删除,直到当前事务结束。那个
是,尝试更新、删除、选择更新的其他事务,
选择“无密钥更新”,选择“共享”,或选择“密钥共享”
这些行将被阻止,直到当前事务结束。为
更新锁定模式也可以通过行上的任何删除以及
修改某些列上的值的更新。目前,
更新案例中考虑的列集是具有
可以在外键中使用的唯一索引(如此部分
不考虑索引和表达式索引),但这可能
未来的变化
更多信息
因此,您不会一次锁定表中的所有行(即,通过
选择锁定所有记录),我建议您使用按顺序以一致的方式对表进行排序,然后执行限制1
,以便只获取队列中的下一行。还添加一个检查特定列值的WHERE
子句(即已处理的),然后在处理后将列设置为一个值,以防止WHERE
子句拾取该列。对您来说,“相互干扰”到底意味着什么?是的。或者,您可以锁定表
,但由于锁升级,这很容易死锁。如果您关心的是在标记为已处理之前确保工作已完成,同时仍然保持并发性,那么您将需要一个真正可靠的任务队列。