Dzięki powyższemu komentarzowi @sudo, jeśli przeniosłem takie stwierdzenia:
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;
wtedy wydaje się, że unikam problemu, użyłem dużych danych (w rzeczywistości sfałszowałem je z powtarzającymi się pętlami przez te same dane). Pamiętaj, że może to nie być najskuteczniejszy sposób robienia tego typu rzeczy, ale działa. Problem z próbą podaną w pytaniu było to, że blokada była prawdopodobnie ograniczona tylko do transakcji, w której została zdefiniowana, a zatem tworzenie funkcji było nadal poza jej zakresem, tj. nie było zablokowane, stąd konflikt pojawiał się. Ale teraz wszystko wydaje się w porządku i elegancko.