6

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

尽管我已经对其进行了测试并且似乎可以正常工作,但我想知道这是否是一种可以接受的方法,还是应该考虑另一种方法?

4

1 回答 1

12

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
于 2012-09-26T11:17:17.293 回答