Postgresql
為什麼 PostgreSQL 在更新外部表時阻止創建新表?
我理解為什麼一個 UPDATE 查詢
tableA
會阻塞一個 ALTER TABLE DDL 語句tableA
。前任:
UPDATE tableA SET column1 = 'test' WHERE id = 1;`
但我正在嘗試創建一個新表,例如
tableB
,它只引用tableA
with的 idON DELETE CASCADE
。CREATE TABLE tableB id REFERENCES tableA(id) ON DELETE CASCADE NOT NULL`;
此查詢一直等到更新完成。
我能夠通過此查詢獲取阻塞 pid 來弄清楚這一點
SELECT pg_blocking_pids(<pid of the create table query>);
我將更新查詢的 pid 作為阻塞 pid。
為什麼創建新表被引用表的 UPDATE 查詢阻塞?
如果您在單個事務中執行這兩個語句,它們將不會相互鎖定。
如果您在不同的事務中執行語句,則必須等待另一個事務完成。原因是外鍵關係是由 PostgreSQL 中的系統觸發器實現的,創建觸發器
tablea
需要SHARE ROW EXCLUSIVE
對錶進行鎖定。如果查看鎖兼容性表,您會發現該鎖與 和所需
ROW EXCLUSIVE
的INSERT
鎖相衝突。UPDATE``DELETE
確保您
UPDATE
在短事務中執行,那麼這不會是一個問題。