【问题标题】:Updating child row locks parent row in PostgreSQL (foreign key, 9.1)在 PostgreSQL 中更新子行锁定父行(外键,9.1)
【发布时间】:2017-08-15 12:29:53
【问题描述】:

我有事务隔离的问题,让我们考虑两个事务:

第一个事务 1 在表 1 上的一行中进行更新,然后事务 2 在子表中的一行中进行更新,该行引用表 1 中在事务 1 中更新的 pk,分析我们可以看到的事务一个锁,事务2将被锁定,直到事务1被提交或回滚,有没有办法避免这个锁?我的事务 1 不会影响表 2,因为它是特定列中的更新。 附言我的 PostgreSQL 版本是 9.1,我检查了 PostgresSQL 9.6 并没有发生,有什么解决方法吗?

【问题讨论】:

    标签: postgresql foreign-keys locking postgresql-9.1


    【解决方案1】:

    您已经确定了如何解决它:升级。 PostgreSQL 9.6 有一个特性,FOR KEY SHARE 锁,外键使用它来避免在插入/更新子行时锁定整行。 9.1 中没有此功能。

    或者,您可以DROP FOREIGN KEY 约束并依赖应用程序来保持一致性。当插入/更新子行时,PostgreSQL 将不再对父行使用FOR SHARE 行锁定,因为不再存在正式的外键关系。

    【讨论】:

    • 此时我无法升级我的 PostgreSQL,我找到了解决方法,我在帖子中写了一个答案。谢谢。
    【解决方案2】:

    采用的方案是将经常更新的列拆分成单独的表,解决了,因为Postgres不会阻塞父表。

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多