Cảm ơn nhận xét của @ sudo ở trên, Nếu tôi đã chuyển các câu lệnh như thế này:
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;
thì có vẻ như để tránh vấn đề, tôi đã sử dụng dữ liệu lớn (thực sự đã làm giả nó với các vòng lặp lặp lại qua cùng một dữ liệu). Xin lưu ý rằng nó có thể không phải là cách hiệu quả nhất để làm việc này, nhưng, nó hoạt động. Sự cố với lần thử được đưa ra trong câu hỏi là khóa có thể chỉ giới hạn trong giao dịch mà nó được xác định và do đó việc tạo chức năng vẫn nằm ngoài phạm vi của nó, tức là không bị khóa, do đó xung đột xuất hiện. Nhưng, tất cả có vẻ ổn và đẹp đẽ bây giờ.