2017-01-05 3 views
0

Я бегу 9.5.2 сервер Postgresql, и я иногда видеть сообщение как:Как интерпретировать сообщение о взаимоблокировке postgresql?

ERROR: deadlock detected
Detail: Process 1234 waits for ShareLock on transaction 3042999324; blocked by process 5678.
Process 5678 waits for ShareLock on transaction 3042999328; blocked by process 1234.
Hint: See server log for query details.
Where: while locking tuple (5389,30) in relation "asset"

Если он содержит какую-либо информацию о строке или столбце, который вызывает затор, это поможет мне отладки большой уродливый common-table expression, который вызывает ошибку в первую очередь.

ответ

0

Я понял это при поиске правильной терминологии для использования при задании моего вопроса: кортеж ссылается на номер строки ctid строки, в каждой строке указывается физическое расположение версии данной строки. (При обновлении строки, Postgresql сохраняет старую версию вокруг некоторое время для того, чтобы выполнить ACID гарантии.)

Вы можете выбрать данные просто с:

SELECT * from "asset" where ctid = '(5389,30)'; 

Однако, если вы будете ждать слишком долго (как и я), задание autovacuum может очистить эту версию строки, если она больше не используется.

Смежные вопросы