PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

pourquoi postgres donne simultanément une erreur de mise à jour de ligne lorsque je verrouille explicitement la table entière

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.