Postgresql
為什麼“SET LOCAL statement_timeout”不能按預期使用 PostgreSQL 函式?
我的理解是 PostgreSQL 函式的執行類似於事務。但是,當我嘗試在函式中“SET LOCAL statement_timeout”時,它不起作用。以下是它在事務中的工作方式:
BEGIN; SET LOCAL statement_timeout = 100; SELECT pg_sleep(10); COMMIT;
結果是(如預期的那樣):
BEGIN SET ERROR: canceling statement due to statement timeout ROLLBACK
但是,如果我將相同的命令放在函式體中:
CREATE OR REPLACE FUNCTION test() RETURNS void AS ' SET LOCAL statement_timeout = 100; SELECT pg_sleep(10); ' LANGUAGE sql; SELECT test();
沒有發生超時,該函式
test()
需要 10 秒才能執行。請告知為什麼這兩種情況不同,以及如何更正它以在函式中設置語句超時。
這種方式
statement_timeout
有效,當伺服器收到來自客戶端的新命令時,時間開始計算。在伺服器端函式內啟動的查詢不是來自客戶端的命令,它們不會重置該計時器或將新計時器推送到計時器堆棧上。
這就是為什麼
SET LOCAL statement_timeout = 100;
沒有效果。如果一個函式發生了,
SET statement_timeout = 100;
它只會從客戶端的下一個命令開始生效。我看不到任何方法可以控制函式內單個查詢的執行時間。