Postgresql
由於更新,相關表上的 ExclusiveLock?
最近遇到以下情況:
考慮由此創建的表:
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 中修復(現在也不支持)
引用發行說明:
防止非鍵欄位行更新阻塞外鍵檢查