PostgreSQLでロックを自動的に解除することは可能ですか?
-
19-09-2019 - |
質問
JDBC マスター/スレーブとして構成された ActiveMQ システムのフォールト トレランスをテストしています。この設定には、1 つの postgres データベースと 2 つのブローカーがあります。1 つはマスター ブローカー、もう 1 つはスレーブ ブローカーです。このメカニズムの仕組みは、マスターがデータベース内のテーブルに対して排他ロックを解除することです。スレーブもこれを試行し、ロックが使用可能になるまで待機します。マスターが死亡した場合は、ロックが解除され、スレーブが引き継ぎます。ただし、マスターがデータベースとのネットワーク接続を失った場合、ロックは解放されず、デッドロック シナリオが発生します。ここで必要と思われるのは、指定された期間内に更新されなかった場合にロックを自動的に解放するように Postgres に指示する方法です。デザイン パターンの POSA 3 ブックでは、これをリース パターンと呼んでいます。Postgresにこれを実行させることは可能ですか?サポートしていない場合、他のデータベース ベンダーはサポートしていますか?
解決
これはデッドロックではなく、接続喪失の問題です。
デッドロックは、2 つのトランザクションが、以前に相互にロックされていたリソースをロックしようとすると発生します。 PostgreSQL
はこれらの状況を検出します。
あなたの場合、 master
リソースをロックし、 slave
待っています master
, 、 そして master
ユーザー入力を待ちますが、接続が失われたために受信されません。
いつでも PostgreSQL
接続の切断を検出すると、トランザクションを自動的にロールバックします。
接続切断の検出を制御するには、次を使用できます。 PostgreSQL
接続オプション:
tcp_keepalives_idle (integer)
をサポートするシステムでは、
TCP_KEEPIDLE
ソケット オプションは、アイドル状態の接続でキープアライブを送信する間隔を秒数で指定します。値がゼロの場合は、システムのデフォルトが使用されます。もしTCP_KEEPIDLE
はサポートされていないため、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケット経由で行われた接続では無視されます。
tcp_keepalives_interval (integer)
をサポートするシステムでは、
TCP_KEEPINTVL
ソケット オプションは、再送信する前にキープアライブへの応答を待機する時間を秒単位で指定します。値がゼロの場合は、システムのデフォルトが使用されます。もしTCP_KEEPINTVL
はサポートされていないため、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケット経由で行われた接続では無視されます。
tcp_keepalives_count (integer)
をサポートするシステムでは、
TCP_KEEPCNT
ソケット オプションは、接続が切断されたとみなされるまでに失われるキープアライブの数を指定します。値がゼロの場合は、システムのデフォルトが使用されます。もしTCP_KEEPCNT
はサポートされていないため、このパラメータはゼロにする必要があります。このパラメータは、Unix ドメイン ソケット経由で行われた接続では無視されます。