【发布时间】:2012-09-25 12:32:50
【问题描述】:
AFAIK,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
虽然我已经对其进行了测试并且似乎可行,但我想知道这是否是一种可以接受的方法,还是我应该考虑另一种方法?
【问题讨论】:
-
是否可以选择至少升级到 8.4 版?如果是这样,您可以使用 pg_terminate_backend() 来终止打开的连接。
-
感谢您的回答。不幸的是,我不能认为升级是理所当然的(不取决于我)。无论如何, pg_terminate_backend() 只会比 kill 命令更好地结束连接,对吧?我的意思是,查询+杀死(或终止)的解决方案是相对可以接受的?
标签: postgresql transactions timeout