Grâce au commentaire de @sudo ci-dessus, si je déplaçais les déclarations comme ceci :
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;
alors cela semble éviter le problème, j'ai utilisé des données volumineuses (en fait, je les ai simulées avec des boucles répétées à travers les mêmes données). Notez que ce n'est peut-être pas le moyen le plus efficace de faire ce genre de chose, mais cela fonctionne. Le problème avec la tentative donnée dans la question était que le verrou n'était probablement limité qu'à la transaction dans laquelle il était défini et que, par conséquent, la création de la fonction était toujours en dehors de sa portée, c'est-à-dire non verrouillée, d'où l'apparition du conflit. Mais, tout semble bien et dandy maintenant.