我有問題的事務隔離,讓我們考慮兩種交易:更新子行鎖父行(外鍵,9.1)
首先交易1做一個更新的一排表1,然後,事務2在子表中引用一行中的更新,該子表引用來自表1中在事務1中更新的pk,分析事務我們可以看到一個鎖,事務2將被鎖定,直到事務1被提交或者回滾爲止,在那裏一種避免這種鎖定的方法?我的交易1不影響表2,因爲它是特定列中的更新。 P.S.我的PostgreSQL版本是9.1,我檢查過PostgresSQL 9.6,但它沒有發生,是否有任何解決方法?
我有問題的事務隔離,讓我們考慮兩種交易:更新子行鎖父行(外鍵,9.1)
首先交易1做一個更新的一排表1,然後,事務2在子表中引用一行中的更新,該子表引用來自表1中在事務1中更新的pk,分析事務我們可以看到一個鎖,事務2將被鎖定,直到事務1被提交或者回滾爲止,在那裏一種避免這種鎖定的方法?我的交易1不影響表2,因爲它是特定列中的更新。 P.S.我的PostgreSQL版本是9.1,我檢查過PostgresSQL 9.6,但它沒有發生,是否有任何解決方法?
所採用的解決方案是將通常更新的列拆分成單獨的表,因爲Postgres不會阻塞父表。
您已經確定如何解決它:升級。 PostgreSQL 9.6有一個特性,FOR KEY SHARE
鎖,外鍵使用它來避免在插入/更新子行時鎖定整行。該功能不在9.1中。
或者,您可以DROP
約束和依靠應用程序來保持一致性。因爲不再有正式的外鍵關係,所以當插入/更新子行時,PostgreSQL將不再在父行上執行FOR SHARE
行鎖。
在這一刻我無法升級我的PostgreSQL,我找到了解決方法,我在我的帖子中寫了一個答案。謝謝。 –