我遇到交易隔离问题,让我们考虑两个交易:
第一个事务1在表1上连续执行更新,然后,事务2在子表中执行更新,该子表引用事务1中更新的表1中的pk,分析我们可以看到的事务一个锁,事务2将被锁定,直到事务1被提交或rollebacked,有没有办法避免这种锁?我的事务1不会影响表2,因为它是特定列中的更新。 附:我的PostgreSQL版本是9.1,我已经检查过PostgresSQL 9.6并且它没有发生,是否有任何解决方法?
答案 0 :(得分:1)
您已经确定了如何修复它:升级。 PostgreSQL 9.6有一个功能FOR KEY SHARE
锁,外键使用它来避免在插入/更新子行时锁定整行。此功能不在9.1中。
或者,您可以DROP
FOREIGN KEY
约束并依赖应用程序来保持一致性。插入/更新子行时,PostgreSQL将不再对父行进行FOR SHARE
行锁定,因为不再存在正式的外键关系。
答案 1 :(得分:1)
采用的解决方案是将常用的更新列拆分为一个单独的表,它解决了,因为Postgres不会阻止父表。