Tack vare @sudos kommentar ovan, Om jag flyttade påståendena så här:
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;
då verkar det undvika problemet, jag har använt stora data (faktiskt fejkade det med upprepade loopar genom samma data). Observera att det kanske inte är det mest effektiva sättet att göra den här typen av saker, men det fungerar. Problemet med försöket som anges i frågan var att låset förmodligen bara var begränsat till transaktionen det definierades i och därför låg skapandet av funktion fortfarande utanför dess räckvidd, dvs inte låst, varför konflikten dök upp. Men allt ser bra ut nu.