更新子行锁定 PostgreSQL 中的父行(外键,9.1)

Updating child row locks parent row in PostgreSQL (foreign key, 9.1)

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

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

您已经确定了修复方法:升级。 PostgreSQL 9.6 有一个特性,FOR KEY SHARE 锁,外键使用它来避免在子行 inserted/updated 时锁定整行。 9.1 中没有此功能。

或者,您可以 DROP FOREIGN KEY 约束并依靠应用程序来保持一致性。当子行为 inserted/updated 时,PostgreSQL 将不再对父行进行 FOR SHARE 行锁定,因为不再有正式的外键关系。

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