PostgreSQL 的事务超时解决方法



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

虽然我已经测试过它并且似乎有效,但我想知道这是否是一种可接受的方法,或者我应该考虑另一种方法?

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

最新更新