[pgpool-general-jp: 988] Re: current transaction is aborted が発生する
松山大樹
t.matsuyama @ wowcom.co.jp
2011年 8月 25日 (木) 16:04:48 JST
こんにちは。
>> こんにちは。
>>
>>>> ちょっと曖昧な書き方だったと思いますが、
>>>> 「エラー処理をしている」と書いたのは、
>>>>
>>>> ERROR: current transaction is aborted, commands ignored until end of
>>>> transaction block
>>>>
>>>> などが発生した時点で、Java側では例外が発生するので、それを受けて
>>>> 自動的にロールバックが走る、という意味でした。このあたりは、
>>>> Seasar2 + S2Dao を使っているので、フレームワークに任せてます。
>>>
>>> しかし、今回のケースでは current transaction is aborted... の前に
>>> dealock detcted などのエラーが発生しているはずで、それが例外処理されて
>>> いないのはおかしいですね(逆に例外処理されていれば、current transaction
>>> is aborted... の状態に到達しない)。フレームワークかアプリケーションに問
>>> 題があるのではないでしょうか。
>>
>> pgpool のログを見ると、
> [snip]
>> となっていて、最初にdeadlock を検知しているようですが、アプリケーション
>> (Java)側では、
>>
>> Caused by: org.postgresql.util.PSQLException: ERROR: current transaction
>> is aborted, commands ignored until end of transaction block
>> at
>> org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2077)
>> :
>> :
>>
>> で例外になっています。
>
> psql でデッドロックをわざと出してみましたが、
>
> test=# begin;
> BEGIN
> test=# lock t1;
> LOCK TABLE
> test=# lock t2;
> ERROR: deadlock detected
> DETAIL: Process 19821 waits for AccessExclusiveLock on relation 16388 of database 16384; blocked by process 19865.
> Process 19865 waits for AccessExclusiveLock on relation 16385 of database 16384; blocked by process 19821.
> HINT: See server log for query details.
> test=#
>
> とpgpool-IIからデッドロックエラーが戻ってきました。
>
>> これによると、pgpool-II が、最初のデッドロックを、エラーとして、アプリ
>> ケーションに(というよりJDBCドライバに)返していないように見えますが。
>
> うーむ、拡張プロトコルを使った時だけの話なのかなぁ。
何度か試してみましたが、デッドロックは返ってきませんね。
一度、S2Dao の方も調べてみますが。
>> そもそも、なんでデッドロックが発生しているのか、よくわからないのですが。
>
> それは PostgreSQL のログに出ている通りです。
これについては、とりあえず insert_lock = false で進めようと思います。
> --
> Tatsuo Ishii
> SRA OSS, Inc. Japan
> English: http://www.sraoss.co.jp/index_en.php
> Japanese: http://www.sraoss.co.jp
>
>
>
pgpool-general-jp メーリングリストの案内