Nach meinem Verständnis werden PostgreSQL-Funktionen ähnlich wie eine Transaktion ausgeführt. Als ich jedoch versuchte, "SET LOCAL statement_timeout" innerhalb einer Funktion zu setzen, funktionierte dies nicht. So funktioniert es innerhalb einer Transaktion:
BEGIN;
SET LOCAL statement_timeout = 100;
SELECT pg_sleep(10);
COMMIT;
wo die Ergebnisse sind (wie erwartet):
BEGIN
SET
ERROR: canceling statement due to statement timeout
ROLLBACK
Wenn ich jedoch dieselben Befehle in einen Funktionskörper einfüge:
CREATE OR REPLACE FUNCTION test() RETURNS void AS '
SET LOCAL statement_timeout = 100;
SELECT pg_sleep(10);
' LANGUAGE sql;
SELECT test();
Das Timeout tritt nicht auf und die test()
Ausführung der Funktion dauert 10 Sekunden.
Bitte geben Sie an, warum sich die beiden Fälle unterscheiden und wie ich sie korrigieren kann, um Anweisungszeitlimits innerhalb einer Funktion festzulegen.
quelle