簡體   English   中英

PostgreSQL 的事務超時解決方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM