[英]Transaction time out workaround for PostgreSQL
據我所知,PostgreSQL 8.3 不支持事務超時。 我已經閱讀了有關將來支持此功能的信息,並且對此進行了一些討論。 但是,由於特定原因,我需要解決此問題的方法。 所以我所做的是一個定期運行的腳本:
1) 基於鎖和活動,查詢以檢索花費時間過長的事務的 processID,並保留最舊的 ( trxTimeOut.sql ):
SELECT procpid
FROM
(
SELECT DISTINCT age(now(), query_start) AS age, procpid
FROM pg_stat_activity, pg_locks
WHERE pg_locks.pid = pg_stat_activity.procpid
) AS foo
WHERE age > '30 seconds'
ORDER BY age DESC
LIMIT 1
2)根據這個查詢,殺死相應的進程( trxTimeOut.sh ):
psql -h localhost -U postgres -t -d test_database -f trxTimeOut.sql | xargs kill
盡管我已經對其進行了測試並且似乎有效,但我想知道這是一種可以接受的方法還是我應該考慮其他方法?
PostgreSQL 從 9.6 版本開始提供idle_in_transaction_session_timeout ,自動終止空閑時間過長的事務。
也可以通過statement_timeout
設置命令可以花費多長時間的限制,獨立於它所處的事務的持續時間,或者它被卡住的原因(忙查詢或等待鎖定)。
要自動中止專門等待鎖定而卡住的事務,請參閱lock_timeout
。
這些設置可以使用如下所示的SET
命令在 SQL 級別設置,或者可以使用ALTER DATABASE
設置為數據庫的默認值,或者使用ALTER USER
設置為用戶,或者通過postgresql.conf
設置為整個實例。
SET statement_timeout=10000; -- time out after 10 seconds
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.