[pgpool-general-jp: 1716] トランザクション中にエラーが発生した場合にROLLBACK TOが出来ない

畑 勝也(トライベック) k-hata @ tribeck.jp
2022年 11月 24日 (木) 11:03:20 JST


はじめまして。畑と申します。

最近、pgpool-IIを3.7.4から4.3.3にバージョンアップしたのですが、
トランザクション中にエラーが発生した場合にROLLBACK TOで
特定のSAVEPOINTに戻ろうとしたのですが、

ERROR:  current transaction is aborted, commands ignored until end of transaction block

というエラーメッセージが出力され、SAVEPOINTに戻る事が出来なくなりました。
ROLLBACK TOではなく、ROLLBACKだとエラーもなく正常に動作します。

3.7.4を利用していた頃には発生しておりませんでした。
つきましては、以下についてご教示いただけますと幸いです。

・これは仕様が変わったという事でしょうか?
・設定の変更などでROLLBACK TOが有効なるのでしょうか?


[動作環境]
・2台のサーバにPostgreSQLとpgpool-IIをそれぞれインストール
・pgpool-IIはwatchdogで相互監視を実施
・PostgreSQLはストリーミングレプリケーション構成
・PostgreSQLのバージョンは14.5(10.17でも試しましたが同じ結果でした)

[実行内容]
--------------------------------------------------------------------------------
test_db=# create table savepoint_test (
test_db(#   id integer not null,
test_db(#   name text not null
test_db(# );
LOG:  DB node id: 1 backend pid: 7274 statement: SELECT version()
LOG:  DB node id: 1 backend pid: 7274 statement: create table savepoint_test (
  id integer not null,
  name text not null
);
CREATE TABLE
test_db=# alter table savepoint_test
test_db-#   add constraint pk_savepoint_test
test_db-#   primary key (id);
LOG:  DB node id: 1 backend pid: 7274 statement: alter table savepoint_test
  add constraint pk_savepoint_test
  primary key (id);
ALTER TABLE
test_db=#
test_db=# BEGIN;
LOG:  DB node id: 0 backend pid: 2417 statement: BEGIN;
LOG:  DB node id: 1 backend pid: 7274 statement: BEGIN;
BEGIN
test_db=*# insert into savepoint_test values (1, 'save01');
LOG:  DB node id: 1 backend pid: 7274 statement: insert into savepoint_test values (1, 'save01');
INSERT 0 1
test_db=*# SAVEPOINT SAVE01;
LOG:  DB node id: 0 backend pid: 2417 statement: SAVEPOINT SAVE01;
LOG:  DB node id: 1 backend pid: 7274 statement: SAVEPOINT SAVE01;
SAVEPOINT
test_db=*# insert into savepoint_test values (1, 'save01');
LOG:  DB node id: 1 backend pid: 7274 statement: insert into savepoint_test values (1, 'save01');
LOG:  pool_send_and_wait: Error or notice message from backend: : DB node id: 1 backend pid: 7274 statement: "insert into savepoint_test values (1, 'save01');" message: "duplicate key value violates unique constraint "pk_savepoint_test""
ERROR:  duplicate key value violates unique constraint "pk_savepoint_test"
DETAIL:  Key (id)=(1) already exists.
test_db=!# ROLLBACK TO SAVEPOINT SAVE01;
ERROR:  current transaction is aborted, commands ignored until end of transaction block
DETAIL:  statement: ROLLBACK TO SAVEPOINT SAVE01;
test_db=!# ROLLBACK;
LOG:  DB node id: 1 backend pid: 7274 statement: ROLLBACK;
LOG:  DB node id: 0 backend pid: 2417 statement: ROLLBACK;
ROLLBACK
test_db=#
--------------------------------------------------------------------------------
※client_min_messagesをlogに設定しております

気になる点としては、「ROLLBACK TO SAVEPOINT SAVE01」の実行について、
pgpool-IIのログファイルに何も出力されていない事です。
pgpool-II側でエラーと判断しPostgreSQL側にSQLの実行をリクエストしていない
ように思います。


以上、よろしくお願いします。



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