2010年12月 7日

[pgsql-jp: 40599] Re:トランザクションの結果反映遅延についてご質問

2010/12/7 <toshihideka4316@xxxxx>:
> ログは以下の通りです。

ログを見る限り、「トランザクションの結果反映に遅延が生じる」原因は、
やはり実際にはサーバで処理が続いていたためのようです。「コミット」と
あるところでは、実際にはまだコミットは完了していません。
out of memory の際に、サーバがパイプの切断を検知していることから、
DB⇔AP間で適切な通信ができなくなっていることは確実です。


対策としては、out of memory にならないようAPを作るのが前提ですが、
もし out of memory した場合はトランザクションの顛末がどうなったかを、
他の接続から確認する必要があると思われます。その場合、別接続経由で
pg_cancel/terminate_backend で処理を強制停止することも視野に入ります。


とはいえ、サーバやドライバの動きにも、若干気になる点があります:

> ⇒5)にてコミット後に接続を切断しない場合、コミットを行ってから20分たってもト
> ランザクションの結果が反映されない

なぜ切断がコミットに結び付くのかが不思議です。切断時に通信キューを
フラッシュするような動作になるんでしょうか? サーバプロセス自体は
生きているので、SELECT が終わった後、キューに残っている COMMIT を
受け取ってしまうのかもしれません。

また、サーバ側での COMMERROR は、エラーレベルとしては LOG 扱いで、
処理は継続してしまうようです。これって妥当な動作なんでしたっけ?
通信バッファ溢れ程度ならばリトライが望ましいとは思いますが、
言ってみれば「途中で電話は切れましたが、申し込みは受け付けました!」
となるのは、まずいケースもあるような気がします。

--
Itagaki Takahiro

投稿者 xml-rpc : 2010年12月 7日 14:44
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/100594
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。