[pgpool-general-jp: 987] Re: current transaction is aborted が発生する

Tatsuo Ishii ishii @ sraoss.co.jp
2011年 8月 25日 (木) 14:42:02 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ドライバに)返していないように見えますが。

うーむ、拡張プロトコルを使った時だけの話なのかなぁ。

> そもそも、なんでデッドロックが発生しているのか、よくわからないのですが。

それは PostgreSQL のログに出ている通りです。
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp


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