Это, безусловно, звучит как замок.
Подход "большой молоток" заключается в том, чтобы отразить (остановить / запустить) вашу базу данных, чтобы уничтожить все выполняющиеся запросы.
Подход "скальпеля" заключается в запуске show full processlist;
и попытке найти выполняющийся запрос, который мог бы создать блокировку. Обратите внимание, что сам запрос может не блокировать строку, но более ранний запрос в той же транзакции мог заблокировать ее. Любой длительный запрос является подозрительным.
EDIT
Я обнаружил проблему в postgres, которая сохраняет блокировку даже после перезапуска . Вот как вы можете найти и исправить это:
Запустить этот запрос:
select * from pg_prepared_xacts
Вот документация для этого системного представления
Если есть какие-либо строки, это означает, что есть потерянные / зависшие транзакции, которые могут удерживать блокировки даже после перезапуска postgres .
Чтобы убить их, для каждой строки получите gid
(длинный UUID) и выполните это:
ROLLBACK PREPARED '<paste gid here>'
Это должно очистить вещи.
Если вы работаете на платформе * nix, вы можете запустить эту единственную команду, которая сделает все:
psql -U postgres mydatabase -c "select * from pg_prepared_xacts" | grep -v transaction | grep \| | awk '{print $3}' | xargs -I % psql -U postgres mydatabase -c "ROLLBACK PREPARED '%'"