Благодарение на коментара на @sudo по-горе, ако преместих изявленията така:
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;
тогава изглежда, че избягва проблема, използвах големи данни (всъщност го фалшифицирах с повтарящи се цикли през едни и същи данни). Имайте предвид, че това може да не е най-ефективният начин да правите подобни неща, но работи. Проблемът с опита, посочен във въпроса е, че заключването вероятно е ограничено само до транзакцията, в която е дефинирано, и следователно създаването на функция все още е извън нейния обхват, т.е. не е заключено, следователно се появява конфликтът. Но сега всичко изглежда наред.