PostgreSQL автоматически обнаруживает взаимоблокировки . Скорее всего, вы блокируете только какое-то утверждение, которое еще не закончено. Тупиковая ситуация возникает, только если два оператора ждут друг друга.
Если вы изучите свое "дерево блокировок" вплоть до корня (d, блокирующее для b, блокирующее для a, имеет a в корне), вы, скорее всего, найдете где-нибудь транзакцию, которая либо занимает много времени, либо не зафиксировано должным образом, а просто находится в режиме ожидания в транзакции.
Поскольку вы упоминаете о потоках, имейте в виду, что все клиентские библиотеки не обязательно являются поточно-ориентированными на стороне клиента.