【问题标题】:How to handle concurrent request in postgres?如何在 postgres 中处理并发请求?
【发布时间】:2019-03-02 07:03:26
【问题描述】:

场景:- 有一个表 X。当新请求到来时,使用 'select' 来检查记录的存在,如果使用 insert 没有找到记录,则将数据插入到表中。一旦“插入”发生,触发器就会在表 X 上触发

问题:- 插入时间为 10 秒。 当 Select 被触发时(在 5 秒内),直到那个时间之前的插入还没有完成。因此,正在插入多条记录。此外,触发器也会再次触发。

如何解决这个问题?有什么克服这种情况的建议吗?

【问题讨论】:

    标签: postgresql select concurrency insert


    【解决方案1】:

    在插入新行之前使用 SELECT 语句来防止重复行永远不会正常工作(至少不能以可接受的性能)。

    在您的表上创建一个唯一键或约束,以防止插入重复值并处理发生的任何错误。

    如果这样做,您还可以使用insert ... on conflict do update ...,它可以安全地用于并发插入。

    【讨论】:

    • 使用上面提到的策略,我创建了一个中间表(具有唯一键约束和一个标志),一旦将数据插入到主表中,那么这个中间表的标志就会改变并完成检查。当相同的请求到来时,由于唯一约束,记录不会插入到中间表中,并且主表中不会发生插入
    【解决方案2】:

    我认为您需要查看 Postgres 手册中的 13.2. Transaction Isolation。默认情况下,已提交读取允许您相互独立地进行读写,因此您需要更改行为以阻止读取或提交,但这取决于您希望它在应用程序中的使用方式,因此请阅读后再决定.

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2021-05-01
      • 2011-01-11
      相关资源
      最近更新 更多