Hai tham số chặn hai kiểu sự cố khác nhau.
statement_timeout — huỷ một câu lệnh chạy quá lâu. Bảo vệ khỏi truy vấn lỗi plan, quét toàn bảng ngoài ý muốn, hay báo cáo nặng lọt vào giờ cao điểm.
idle_in_transaction_session_timeout — ngắt session đã BEGIN nhưng đứng yên không làm gì, không COMMIT cũng không ROLLBACK. Đây là trạng thái nguy hiểm nhất vì session đó vẫn giữ lock, giữ snapshot cũ khiến vacuum không dọn được dead tuple, và với PgBouncer thì giữ luôn một server connection. Nguyên nhân điển hình: ứng dụng mở transaction rồi gọi một API bên ngoài, hoặc lập trình viên BEGIN trong psql rồi bỏ đó.
Còn lock_timeout bổ sung góc thứ ba: giới hạn thời gian chờ lấy lock, không tính thời gian thực thi.
Đặt theo phạm vi thay vì một giá trị chung:
-- default for the app user
alter role app_user set statement_timeout = '15s';
alter role app_user set idle_in_transaction_session_timeout = '30s';
-- report user needs longer
alter role report_user set statement_timeout = '5min';Mức thường dùng: API đồng bộ 5–30 giây, báo cáo/ETL vài phút, idle_in_transaction 30–60 giây.
Đặt ở cấp role hoặc SET LOCAL trong transaction, không đặt trong postgresql.conf cho toàn cluster — vì như vậy job bảo trì và migration hợp lệ cũng bị huỷ giữa chừng.