2017-08-15 82 views
0

我有问题的事务隔离,让我们考虑两种交易:更新子行锁父行(外键,9.1)

首先交易1做一个更新的一排表1,然后,事务2在子表中引用一行中的更新,该子表引用来自表1中在事务1中更新的pk,分析事务我们可以看到一个锁,事务2将被锁定,直到事务1被提交或者回滚为止,在那里一种避免这种锁定的方法?我的交易1不影响表2,因为它是特定列中的更新。 P.S.我的PostgreSQL版本是9.1,我检查过PostgresSQL 9.6,但它没有发生,是否有任何解决方法?

回答

1

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

1

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

或者,您可以DROP约束和依靠应用程序来保持一致性。因为不再有正式的外键关系,所以当插入/更新子行时,PostgreSQL将不再在父行上执行FOR SHARE行锁。

+0

在这一刻我无法升级我的PostgreSQL,我找到了解决方法,我在我的帖子中写了一个答案。谢谢。 –

相关问题