PostgreSQL的事务超时解决方法

时间:2012-09-25 12:32:51

标签: postgresql transactions timeout

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

虽然我已经对它进行了测试并且似乎有效,但我想知道它是否是一种可接受的方法,还是应该考虑另一种方法?

1 个答案:

答案 0 :(得分:4)

自版本9.6起,PostgreSQL提供idle_in_transaction_session_timeout,以自动终止空闲时间过长的事务。

还可以通过statement_timeout来设置命令可以花费多长时间的限制,具体取决于它所处的事务持续时间,或者为什么它被卡住(忙于查询或等待锁定)。 / p>

要自动中止专门等待锁定的交易,请参阅lock_timeout

可以使用下面显示的SET等命令在SQL级别设置这些设置,也可以将其设置为ALTER DATABASE的数据库的默认设置,或设置为ALTER USER的用户的默认设置,或通过postgresql.conf整个实例。

SET statement_timeout=10000;   -- time out after 10 seconds