上記の@sudoのコメントのおかげで、次のようにステートメントを移動した場合:
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;
それからそれは問題を回避するようです、私は大きなデータを使用しました(実際には同じデータを繰り返しループすることでそれを偽造しました)。この種のことを行うのに最も効率的な方法ではないかもしれないが、それは機能することに注意してください。 質問で与えられた試みの問題 ロックはおそらくそれが定義されたトランザクションにのみ制限されていたため、関数の作成はまだその範囲外でした。つまり、ロックされていなかったため、競合が発生していました。しかし、今ではすべてが順調でダンディに見えます。