Вот таблица (упрощенная):
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.
Как этот запрос, выполняемый параллельно несколькими процессами, может привести к тупиковой ситуации?
Спасибо!
SELECT
может быть заблокирован обновлением в зависимости от уровня изоляции транзакции. Если на ваш внутренний выбор влияет какой-либо из обновляемых столбцов, значит, у вас проблема. Кстати: зависимость может быть черезJOIN
, а не только через прямое предложениеWHERE
... BTW: Почему вы вообще обновляете свойpage_id
? Это внешний ключ, и поэтому обновление может иметь более серьезные побочные эффекты. - person Germann Arlington   schedule 12.10.2012