[pgsql-jp: 41044] Re: トランザクション中のネットワーク切断

水口(ヴァンガードネットワークス) mizuguchi @ vanguard.ne.jp
2012年 1月 30日 (月) 15:11:11 JST


水口です。

遅くなって申し訳ありません。
みなさん、返信ありがとうございます。
いろいろ検証した結果です。

検証1.バジョン8.3ではPostgresql.confの下記設定項目はWINDOWSではサポートさ
れていないようです。
 tcp_keepalives_idle
 tcp_keepalives_interval
 tcp_keepalives_count
 
 一応試してみましたが、ログにnot supportが出力され
 そのままで試してみてもトランザクションは解放されませんでした。

 ちなみにバージョン9.1で試した所
 tcp_keepalives_idle、tcp_keepalives_interval この2つは利用でき、目的通り
解放されました。


検証2.WINDOWSのレジストリを変更した所、トランザクションが解放されました。
 KeepAliveTime=3000ms
 KeepAliveInterval=1200ms
 レジストリの変更は他のソフトに影響が出そうで、あまり気のりはしないです
が・・・
 (http://support.microsoft.com/kb/314053/ja)

検証3.途中で思いついたのですが
  select (current_timestamp - xact_start) as duration , * from
pg_stat_activity
  を実行すると実施中のトランザクションがどのくらい実施中かわかるので、規定
時間以上たっだ
  プロセスをチェックし、プログラム上から「Pg_Ctl kill TERM procid」コマン
ドを投げて殺すという方法でも
  トランザクションは解放されました。
  ただこの方法が王道?なのかわかりませんが。

「結論」
8.3シリーズならレジストリ操作で対応
(http://support.microsoft.com/kb/314053/ja)
 KeepAliveTime
 KeepAliveInterval
 TcpMaxDataRetransmissions

9.1シリーズならpostgresql.confで対応
 tcp_keepalives_idle
 tcp_keepalives_interval


-----Original Message-----
From: pgsql-jp-bounces @ ml.postgresql.jp
[mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Tatsuo Ishii
Sent: Friday, January 27, 2012 9:10 PM
To: pgsql-jp @ ml.postgresql.jp; maumau307 @ gmail.com
Subject: [pgsql-jp: 41036] Re: トランザクション中のネットワーク切断

石井です。

pgpool-IIを使えばできます。

pgpool-IIにはclient_idle_limitという設定値があり、ここで指定した秒数を
経過してもクライアント(ここではnpgsqlを使ったアプリケーション)が何もコ
マンドを送ってこないようだと、(まだ接続が生きていれば)クライアントへの
接続を切断し、かつPostgreSQLの方はトランザクションをアボートさせるので、
ロックは解放されます。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp

> 水口さん
>
>
> はじめまして、MauMauといいます。
>
> 一定時間アイドル状態のトランザクションを自動的に終了させる機能は、
> 残念ながら、今のPostgreSQLにはありません。
> ただ、やるべきこと(TODO)として、以前から次のページに列挙されています。
> 議論はされているようですが、実装が難しいようです。
> 議論を読んでいないので難しい理由はわかりませんが、
> トランザクションを強制終了しても接続を維持しようとするからではないかと
> 思います。
>
> 接続も強制終了させてしまえば、あまり難しくないと思うのですが・・・
>
> http://wiki.postgresql.org/wiki/Todo
> [抜粋]
> Allow administrators to cancel multi-statement idle transactions This
> allows locks to be released, but it is complex to report the
> cancellation back to the client.
>
> Cancelling idle in transaction state
> Re: Cancelling idle in transaction state
>
> Add idle_in_transaction_timeout GUC so locks are not held for long
> periods of time
>
> 代わりの手段として、次のページに記されているtcp_keepalive_xxx
> という3つのパラメタが使えるかもしれません。
>
> http://www.postgresql.jp/document/pg910doc/html/runtime-config-connect
> ion.html
>
> これは、サーバがクライアントとのTCP/IP接続を監視するためのものです。
> TCP/IP接続がtcp_keepalives_interval秒間アイドルだったら、
> サーバはクライアントに対し、
> tcp_keepalives_interval秒間隔で最大tcp_keepalives_count回数だけ
> 「あなたは生きてますか?」という確認メッセージを送ります。
> 最大回数だけ送ってもクライアントから返事がなければ、
> その接続を切断します。
>
> もしよければ、おためしいただいた結果を共有いただければ幸いです。
>
>
> 以上です。
>
> ----- Original Message -----
> From: "水口(ヴァンガードネットワークス)" <mizuguchi @ vanguard.ne.jp>
> To: <pgsql-jp @ ml.postgresql.jp>
> Sent: Friday, January 27, 2012 7:26 PM
> Subject: [pgsql-jp: 41034]トランザクション中のネットワーク切断
>
>
>> 初めまして。水口と申します
>>
>> クラザバ系のシステムで
>> クライアントPGの処理で
>> あるテーブルをSELECT FOR UPDATE して更新、コミットする処理がありますが
>>
>> SELECT FRO UPDATE後に障害でネットワークが切断されると
>> そのテーブルがロックしたままとなり
>> 他のクライアントの同じ処理でSELECT FOR UPDATE できなくなってしまいます
>> この様に浮いてしまったトランザクションは自動的に解放されないのでしょう
>> か?
>>
>> 分かる方いるでしょうか?
>>
>> 環境
>> SERVER:WINDOWS7-32Bit postgresql8.3.12 CLIENT:WINDOWS7-32Bit Vb.net
>> 接続には、NPGSQLを利用しています。



pgsql-jp メーリングリストの案内