据我所知,PostgreSQL 8.3不支持事务超时。我已经阅读了关于未来支持此功能的文章,并且有一些讨论。但是,由于特定原因,我需要解决此问题的解决方案。因此,我编写了一个定期运行的脚本:
1)基于锁和活动,查询以检索正在进行太长时间的事务的进程ID,并保留最旧的(trxTimeOut.sql):
1)基于锁和活动,查询以检索正在进行太长时间的事务的进程ID,并保留最旧的(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
尽管我已经测试过它并且似乎有效,但我想知道它是否是可接受的方法,或者我应该考虑其他方法?