Tại sao, SET SET LOCAL statement_timeout không hoạt động như mong đợi với các hàm PostgreSQL?


9

Tôi hiểu rằng các chức năng PostgreSQL được thực hiện tương tự như một giao dịch. Tuy nhiên, khi tôi cố gắng "SET LOCAL statement_timeout" trong một hàm, nó không hoạt động. Đây là cách nó hoạt động trong một giao dịch:

BEGIN; 
  SET LOCAL statement_timeout = 100; 
  SELECT pg_sleep(10); 
COMMIT;

nơi kết quả (như mong đợi):

BEGIN
SET
ERROR:  canceling statement due to statement timeout
ROLLBACK

Tuy nhiên, nếu tôi đặt các lệnh tương tự trong một thân hàm:

CREATE OR REPLACE FUNCTION test() RETURNS void AS '
    SET LOCAL statement_timeout = 100;
    SELECT pg_sleep(10);
' LANGUAGE sql;

SELECT test();

thời gian chờ không xảy ra và chức năng test()mất 10 giây để thực thi.

Vui lòng tư vấn tại sao hai trường hợp khác nhau và cách tôi có thể sửa nó để đặt thời gian chờ câu lệnh trong một hàm.

Câu trả lời:


10

Cách thức statement_timeouthoạt động, thời gian bắt đầu đếm khi máy chủ nhận được lệnh mới từ máy khách.

Các truy vấn khởi chạy bên trong các chức năng phía máy chủ không phải là lệnh từ máy khách, chúng không đặt lại bộ hẹn giờ đó hoặc đẩy một cái mới lên một bộ tính giờ.

Đây là lý do tại sao SET LOCAL statement_timeout = 100;không có hiệu lực.

Và nếu một chức năng thực hiện, SET statement_timeout = 100;nó sẽ có hiệu lực chỉ bắt đầu từ lệnh tiếp theo từ máy khách.

Tôi không thấy bất kỳ cách nào để kiểm soát thời gian thực hiện của các truy vấn riêng lẻ trong một hàm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.