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