PostgreSQL的事务超时解决方法

Fed*_*ina 2 postgresql timeout transactions

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
Run Code Online (Sandbox Code Playgroud)

2)根据此查询,终止相应的进程(trxTimeOut.sh):

psql -h localhost -U postgres -t -d test_database -f trxTimeOut.sql | xargs kill
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ité 6

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

还可以statement_timeout独立于命令在事务中的持续时间或卡住的原因(繁忙的查询或等待锁定)来设置限制,命令可以花多长时间通过。

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

这些设置可以在使用命令的SQL水平等进行设定SET如下所示,也可以与被设置为默认为一个数据库ALTER DATABASE,或者用户与ALTER USER,或以整个实例通过postgresql.conf

SET statement_timeout=10000;   -- time out after 10 seconds
Run Code Online (Sandbox Code Playgroud)

  • @gregtzar:我重写了确实与 PG 8.3 一样过时的答案。感谢您的提醒! (2认同)