M.S*_*sti 12 postgresql transaction functions query-timeout
我的理解是 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 秒。
请告知为什么这两种情况不同,以及我如何纠正它以在函数内设置语句超时。
Dan*_*ité 15
方法statement_timeout
是,当服务器收到来自客户端的新命令时,时间开始计算。
在服务器端函数中启动的查询不是来自客户端的命令,它们不会重置该计时器或将新计时器推送到计时器堆栈上。
这就是SET LOCAL statement_timeout = 100;
没有效果的原因。
如果一个函数执行SET statement_timeout = 100;
它,它只会从客户端的下一个命令开始生效。
我没有看到任何方法来控制函数内单个查询的执行时间。