Gracias al comentario anterior de @sudo, si moví las declaraciones así:
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;
entonces parece evitar el problema, he usado grandes datos (en realidad lo falsifiqué con bucles repetidos a través de los mismos datos). Tenga en cuenta que puede que no sea la forma más eficiente de hacer este tipo de cosas, pero funciona. El problema con el intento dado en la pregunta fue que el bloqueo probablemente solo se limitó a la transacción en la que se definió y, por lo tanto, la creación de la función aún estaba fuera de su alcance, es decir, no estaba bloqueada, por lo que aparecía el conflicto. Pero, todo parece estar bien y elegante ahora.