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

时间:2017-08-15 12:29:53

标签: postgresql foreign-keys locking postgresql-9.1

我遇到交易隔离问题,让我们考虑两个交易:

第一个事务1在表1上连续执行更新,然后,事务2在子表中执行更新,该子表引用事务1中更新的表1中的pk,分析我们可以看到的事务一个锁,事务2将被锁定,直到事务1被提交或rollebacked,有没有办法避免这种锁?我的事务1不会影响表2,因为它是特定列中的更新。 附:我的PostgreSQL版本是9.1,我已经检查过PostgresSQL 9.6并且它没有发生,是否有任何解决方法?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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