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

Tatsuo Ishii ishii @ sraoss.co.jp
2012年 1月 27日 (金) 21:10:08 JST


石井です。

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-connection.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 メーリングリストの案内