Postgresql

為什麼 PostgreSQL 在更新外部表時阻止創建新表?

  • March 15, 2021

我理解為什麼一個 UPDATE 查詢tableA會阻塞一個 ALTER TABLE DDL 語句tableA

前任:

UPDATE tableA SET column1 = 'test' WHERE id = 1;`

但我正在嘗試創建一個新表,例如tableB,它只引用tableAwith的 id ON 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 EXCLUSIVEINSERT鎖相衝突。UPDATE``DELETE

確保您UPDATE在短事務中執行,那麼這不會是一個問題。

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