[pgsql-jp: 40173] Re: update文のフリーズ

Eiichiro Sakai sakai @ agate-japan.com
2010年 2月 16日 (火) 21:35:46 JST


メーリングリスト各位

お世話になります。
酒井です。

先日ポストした内容に機種依存文字が含まれていたため、
再度編集しポストしなおさせていただきます。
大変申し訳ございませんでした。

postgres8.3.7を運用しているのですが、以下のような現象に
遭遇し助言をいただきたくポストさせていただきました。

以下のようなSQLをpgpool2(2.1)経由で複数のプロセスより大量に実行していたと
ころupdate文(下記tr2)が途中でフリーズし、その後同様のSQLを実行しても
select for update文(下記tr1)がロック待ちの状態となり滞留し続けていく状況と
なりました。

begin;
select * from tableA where id = 1;(tr1)
その他の処理
update tableA SET column = xx where id = 1;(tr2)
commit;

1.トリガとなったupdate文のSQLログを見るとbindまでは出力されていますが、
  executeのログが出力されていない状況で止まってしまっています。
  これはどのような時に発生しうるでしょうか?
  回避策をご存じの方がいらっしゃればご教授いただければと思います。

2.tr2でフリーズ後のpg_stat_activityを見るとフリーズが起こる前に実行されて
い
    るがtr1でロック待ちのままとなっているトランザクションが多数存在していま
した。
  ただ、フリーズが起こる前は他のいくつかのトランザクションは正常終了(上記
    commitまで終了)している状態です。
  このことよりpostgresは必ずしもロック要求があった順番にロック取得
  しているわけではないように思えますが理解は正しいでしょうか?


お忙しいところ申し訳ありませんが、何卒よろしくお願いいたします。

---------------------------------------
Agate Inc.
酒井 英一郎
E-Mail:sakai @ agate-japan.com



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