我的理解是 PostgreSQL 函数的执行类似于事务。但是,当我尝试在函数中“SET LOCAL statement_timeout”时,它不起作用。以下是它在事务中的工作方式:
BEGIN;
SET LOCAL statement_timeout = 100;
SELECT pg_sleep(10);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
结果在哪里(如预期的那样):
BEGIN
SET
ERROR: canceling statement due to statement timeout
ROLLBACK
Run Code Online (Sandbox Code Playgroud)
但是,如果我将相同的命令放在函数体中:
CREATE OR REPLACE FUNCTION test() RETURNS void AS '
SET LOCAL statement_timeout = 100;
SELECT pg_sleep(10);
' LANGUAGE sql;
SELECT test();
Run Code Online (Sandbox Code Playgroud)
超时不会发生,函数test()执行需要 10 秒。
请告知为什么这两种情况不同,以及我如何纠正它以在函数内设置语句超时。