下面是表(簡體):Postgresql - >來自簡單更新的死鎖。我不能讓事業
Table "public.link" Column | Type | Modifiers ---------------+-----------------------------+--------------------------------------------------- id | integer | not null default nextval('link_id_seq'::regclass) page_id | integer | placed_at | timestamp without time zone | default now() Indexes: "link_pkey" PRIMARY KEY, btree (id) "link_page_id_index" btree (page_id) Foreign-key constraints: "link_page_id_foreign_key" FOREIGN KEY (page_id) REFERENCES page(id) ON UPDATE RESTRICT ON DELETE RESTRICT
這裏是查詢(簡體):
UPDATE link SET page_id = ?, placed_at = now()
WHERE id IN (SELECT id FROM link ...) AND page_id IS NOT NULL
死鎖消息:
ERROR: deadlock detected Detail: Process 5822 waits for ShareLock on transaction 19705; blocked by process 5821. Process 5821 waits for ShareLock on transaction 19706; blocked by process 5822. Hint: See server log for query details.
如何可以通過多個進程並行執行的查詢導致死鎖?
謝謝!
行什麼是你的選擇標準爲內部選擇? –
@Germann Arlington,它是從SELECT鏈接JOIN到另一個表。但它有道理嗎?選擇不會導致死鎖,更新的問題。 –
根據事務隔離級別,'SELECT'可能被更新阻塞。如果您的內部選擇受到您正在更新的任一列的影響,那麼您遇到了問題。順便說一句:依賴可能通過'JOIN',而不僅僅是直接'WHERE'子句... 順便說一句:你爲什麼更新你的'page_id'呢?這是一個外鍵,因此更新也可能有更深的副作用。 –