Díky výše uvedenému komentáři @sudo, Kdybych přesunul výroky takto:
BEGIN;
SELECT pg_advisory_xact_lock(2142616474639426746);
CREATE OR REPLACE FUNCTION my_function() ....
--the whole function definition is wrapped by an advisory lock
SELECT * FROM my_function();
COMMIT;
pak se zdá, že se tomuto problému vyhýbám, použil jsem velká data (ve skutečnosti je předstíral opakovanými smyčkami přes stejná data). Všimněte si, že to nemusí být nejúčinnější způsob, jak to udělat, ale funguje to. Problém s pokusem uvedeným v otázce bylo, že zámek byl pravděpodobně omezen pouze na transakci, ve které byl definován, a proto vytvoření funkce bylo stále mimo jeho rozsah, tj. nebylo uzamčeno, a proto se objevil konflikt. Ale teď se vše zdá být v pořádku.