Postgresql

由於更新,相關表上的 ExclusiveLock?

  • November 28, 2018

最近遇到以下情況:

考慮由此創建的表:

create table table_a (
       id  bigserial not null,
       last_update timestamp,
       primary key (id)
);

create table table_b (
       id  bigserial not null,
       primary key (id)
);

alter table table_b add column a_id int8;
alter table table_b add constraint fk_c foreign key (a_id) references table_a;

然後,以下查詢(比此處顯示的範例花費的時間可能讓您懷疑):

update table_a set last_update = now() where id in(<list of ids>);

我觀察到這個更新查詢ExclusiveLock在 table_b 上創建了一個。

這看起來很奇怪,因為 table_b 根本沒有被查詢使用。或者我認為。

這裡發生了什麼?是否where id in隱式創建此鎖?

無論哪種方式,我怎樣才能避免這種情況?我的理解在哪裡失敗?

此外,顯示這個鎖的查詢顯示在 table_b 上:

SELECT a.datname,
     c.relname,
     l.transactionid,
     l.mode,
     l.GRANTED,
     a.usename,
     a.current_query,
     a.query_start,
     age(now(), a.query_start) AS "age",
     a.procpid
FROM pg_stat_activity a
JOIN pg_locks l ON l.pid = a.procpid
JOIN pg_class c ON c.oid = l.relation
WHERE pid <> pg_backend_pid()
ORDER BY a.query_start;

PostgreSQL 9.1 無法解決這個問題

直到 9.2(包括)任何引用表在更新期間都被鎖定。

這已在 PostgreSQL 9.3 中修復(現在也不支持)

引用發行說明

防止非鍵欄位行更新阻塞外鍵檢查

引用自:https://dba.stackexchange.com/questions/223641