[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 メーリングリストの案内