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