Как мне интерпретировать сообщение о взаимоблокировке 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)';
Однако, если вы будете ждать слишком долго (как я это сделал), задание автоочистки может очистить эту версию строки, если она больше не используется.