[pgsql-jp: 36569] Re: JDBC+pgpool利用時の不具合(!?)について

Tatsuo Ishii ishii @ sraoss.co.jp
2005年 12月 17日 (土) 10:14:09 JST


石井です。

> 山田です。
> 
> 石井様>
> たびたびのご対応と修正版のご提供、感謝しております。

こちらこそおつきあいいただき、ありがとうございます。

> > 本日本家MLでちょっとやり取りしてみたのですが、結果 Execute したあとに、
> > pgpoolの中から"Flush"というメッセージを送ってあげればよさそうだ、とい
> > うことが分かりました。Flushは、バックエンドに対して、バッファリングさ
> > れているメッセージをすべてフロントエンドに送るように指示します。これで
> > Executeの完了が間接的に分かるので、うまくいくと思います。
> 
> ふむ、ふむ、syncの前にflushというのは、なんとなく感覚で
> 理解できますです。
> 
> それで、修正版のほうで試させていただきました。
> 結果ですが、5回ほど実行しまして、うち2回が2サーバーから
> 10000行の挿入に成功して、他3回が最初のメールと同じように
> デッドロック(!?)と思われる現象が発生しました。
> 最初の時点よりは格段に発生率が下がりましたが、
> なんともすっきりとしない結果になってしまいました。

うーん、そうですか。ということは、Executeの時点で同期をしたのでは足り
なくて、PREPARE, BINDの時点でなんらかのロックが取られているのかもしれ
ませんね。調べてみます。

> 上記のflushとは別の要素や、私どものシステム環境(OSとかH/W)の
> 話になってくるんでしょうか?

関係ないと思います。

> 気になると言えば、PostgreSQLが受け取るコマンドを見ると、
> 通常は理路整然と PREPARE->BIND->EXECUTE と順番に繰り返し
> ているのですが、やはり、停止時にはLOCKコマンドが
> PREPARE, PREPARE, EXECUTE, EXECUTE
> と交差した状態になっています。
> #…というか、これは結局"結果"で、こういう現象が発生する
> #ときにデッドロック(!?)と思しき状態になるのですかね?

これ自体は問題ありません。ただ気になるのは、

db1で、
> 2005-12-16 13:26:20 JST[12444 LOG:  statement: EXECUTE <unnamed>  [PREPARE:  /*STRICT*/ /*1*/ LOCK t1]
> 2005-12-16 13:26:20 JST[12445 LOG:  statement: <BIND>
> 2005-12-16 13:26:20 JST[12445 LOG:  statement: EXECUTE <unnamed>  [PREPARE:  /*STRICT*/ /*2*/ LOCK t1]

と1->2の順にLOCKしているのにたいし、db2では

> 2005-12-16 13:26:20 JST[11821 LOG:  statement: EXECUTE <unnamed>  [PREPARE:  /*STRICT*/ /*2*/ LOCK t1]
> 2005-12-16 13:26:20 JST[11820 LOG:  statement: EXECUTE <unnamed>  [PREPARE:  /*STRICT*/ /*1*/ LOCK t1]

と逆の順序で実行していることです。これだとデッドロックしちゃいますね。

> 上記以外でなにか気になる点(設定や環境)等ございましたら、
> お知らせいただけると幸いです。
> 
> 長くなってしまい恐縮ですが、念のためログを追記いたします。
> それでは、よろしくお願いいたします。

ありがとうございます。更に調べてみます。
--
Tatsuo Ishii
SRA OSS, Inc. Japan



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