[pgpool-general-jp: 978] Re: current transaction is aborted が発生する
Tatsuo Ishii
ishii @ sraoss.co.jp
2011年 8月 25日 (木) 09:09:09 JST
石井です。
> 続けて投稿します。
>
> postgreSQL8.4.8 + pgpool-II 3.1.0-beta2 で、テストをしています。
>
> 発生条件が今ひとつはっきりしないのですが、たまに、
>
> ERROR: current transaction is aborted, commands ignored until end of
> transaction block
>
> というエラーで、insert などが失敗することがあります。
>
> 発生確率が高いのは、
>
> あるプロセスで、
> beginTran
> select nextval('xxxxxxx') でシーケンスを取得
> insert yyyyyyyyy
> commit
> のような連続した登録(50回ぐらい)を行っているときに、
> 別のプロセスで同じように、
> beginTran
> select nextval('xxxxxxx') でシーケンスを取得
> insert yyyyyyyyy
> commit
> を実行する、という状態です。
> ただ、確実にこの状態なら発生するというわけではないのですが。
>
> また、発生したときの状況を聞くと、だいたい多くの人間が使用していて、
> ひんぱんにselect、insert、update が発生しているときのようです。
>
> 漠然とした状況で申し訳ありませんが、原因として何が考えられるでしょうか。
個人メールでログを送っていただいたので見てみました。PostgreSQLのログに
出ていますが、原因はデッドロックですね。以下のような対策を取られると良
いと思います。
1) アプリケーションがクエリの成功/失敗を確認していない。クエリを実行し
てエラーが返ってきたら、アプリケーションはトランザクションをアボート
してエラー処理をすべき。
2) insert_lockがオンになっていると、pgpool-IIはSERIAL型の列を持つテーブ
ルにINSERTしようとしたときに、そのテーブルにロックを取る。このことを
考慮してデッドロックが発生しないように明示的なロックを取るなどの対策
をとる。
3) (デッドロックとは関係ありませんが) select nextval('xxxxxxx') のよう
なパターンをレプリケーションモードで実行すると、取得したシーケンスの
値が不整合になる可能性があるのでおすすめしません。このようなトランザ
クションが並列実行しないように明示的なロックで制御するか、select
nextvalとinsertをまとめて、insertだけにする。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp
pgpool-general-jp メーリングリストの案内