Как мне интерпретировать сообщение о взаимоблокировке postgresql?

Я использую сервер Postgresql 9.5.2 и иногда вижу сообщение вроде:

ОШИБКА: обнаружен тупик
Подробно: Процесс 1234 ожидает ShareLock для транзакции 3042999324; заблокирован процессом 5678.
Процесс 5678 ожидает ShareLock для транзакции 3042999328; заблокирован процессом 1234.
Подсказка: см. Журнал сервера для деталей запроса.
Где: при блокировке кортежа (5389,30) в отношении "актив"

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам