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