Grazie al commento di @sudo sopra, se ho spostato le affermazioni in questo modo:
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;
quindi sembra evitare il problema, ho usato dati di grandi dimensioni (in realtà li ho falsificati con cicli ripetuti attraverso gli stessi dati). Nota che potrebbe non essere il modo più efficiente per fare questo genere di cose, ma funziona. Il problema con il tentativo dato nella domanda era che il blocco era probabilmente limitato solo alla transazione in cui era definito e quindi la creazione della funzione era ancora al di fuori del suo scopo, ovvero non bloccata, quindi stava apparendo il conflitto. Ma ora sembra tutto a posto e dandy.