PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum gibt Postgres gleichzeitig einen Zeilenaktualisierungsfehler aus, wenn ich die gesamte Tabelle explizit sperre

Danke an den Kommentar von @sudo oben, wenn ich die Aussagen wie folgt verschoben hätte:

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;

dann scheint es das Problem zu vermeiden, ich habe große Daten verwendet (tatsächlich mit wiederholten Schleifen durch dieselben Daten gefälscht). Beachten Sie, dass dies möglicherweise nicht der effizienteste Weg ist, um so etwas zu tun, aber es funktioniert. Das Problem mit dem Versuch in der Frage angegeben war, dass die Sperre wahrscheinlich nur auf die Transaktion beschränkt war, in der sie definiert wurde, und daher die Erstellung der Funktion immer noch außerhalb ihres Geltungsbereichs lag, dh nicht gesperrt war, daher trat der Konflikt auf. Aber jetzt scheint alles in Ordnung und gut.