6

私の知る限り、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

私はそれをテストして動作しているように見えますが、それが許容できるアプローチであるかどうか、または別のアプローチを検討する必要があるかどうかを知りたいですか?

4

1 に答える 1

12

PostgreSQL はバージョン 9.6 以降、 idle_in_transaction_session_timeoutを提供して、アイドル状態が長すぎるトランザクションを自動的に終了させます。

statement_timeoutまた、コマンドが実行されているトランザクションの期間や、コマンドが停止する理由 (ビジー クエリまたはロックの待機) とは無関係に、コマンドにかかる時間に制限を設定することもできます。

特にロック待ちでスタックしているトランザクションを自動アボートするには、 を参照してくださいlock_timeout

これらの設定は、以下に示すようなコマンドを使用して SQL レベルで設定したり、 を使用してデータベース、 を使用してユーザー、または を使用してインスタンス全体にSETデフォルトとして設定したりできます。ALTER DATABASEALTER USERpostgresql.conf

SET statement_timeout=10000;   -- time out after 10 seconds
于 2012-09-26T11:17:17.293 に答える