私の知る限り、PostgreSQL 8.3 はトランザクション タイムアウトをサポートしていません。将来的にこの機能をサポートすることについて読んだことがあり、それについていくつかの議論があります。ただし、特定の理由により、この問題の解決策が必要です。だから私がしたことは、定期的に実行されるスクリプトです:
1) ロックとアクティビティに基づいて、時間がかかりすぎて最も古いもの ( trxTimeOut.sql )を保持しているトランザクションのプロセス ID を取得するためにクエリを実行します。
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
私はそれをテストして動作しているように見えますが、それが許容できるアプローチであるかどうか、または別のアプローチを検討する必要があるかどうかを知りたいですか?