JDBC properties for setting rollback scope

JDBCコネクタを使用してクライアントアプリケーションに接続している場合、 autosave および transaction_rollback_scope プロパティを一緒に使用して、トランザクションロールバックスコープを指定します。

これらのプロパティは、接続URLで、またはDriverManager.getConnection への追加のプロパティオブジェクトパラメーターとして指定できます。

自動保存

autosave パラメーターは、複数のステートメントを含むクエリが失敗した場合のドライバーの動作を指定する文字列です。可能な値は次のとおりです。server 、always 、never 、およびconservative 。

  • autosave=server モードでは、JDBCはサーバー側パラメーターtransaction_rollback_scope に依存して、次のステートメントを実行する前に内部サーバーセーブポイントを介して各ステートメントを保存します。クエリ内のステートメントが失敗した場合、サーバーは前のステートメントにロールバックします。このパラメーターがサーバー側でサポートされていない場合、JDBCは接続を拒否します。

  • autosave=always モードでは、JDBCドライバーは最初にサーバーサイドのtransaction_rollback_scope プロパティの使用を試みます。サポートされていない場合、JDBCドライバーは各クエリステートメントの前にセーブポイントを設定し、失敗した場合はそのセーブポイントにロールバックします。

  • autosave=never モード(デフォルト)では、セーブポイントアクティビティは実行されません。 autosave=conservative モードでは、クエリごとにセーブポイントが設定されます。ただし、ロールバックは、「キャッシュされたステートメントは戻り値の型を変更できません」または「ステートメントXXXが無効です」などのまれな場合にのみ行われるため、JDBCドライバーはロールバックして再試行します。

このプロパティのデフォルト値はnever です。

この autosave=server プロパティは、 transaction_rollback_scope 機能を提供するPostgreSQLサーバーでのみ役立ちます。

transaction_rollback_scope

autosave パラメーターは、 SQLステートメントが失敗したときにロールバックする操作の範囲を決定する文字列です。

デフォルト値はTRANSACTION で、トランザクション全体または現在のサブトランザクションがロールバックされます。これは、 SET TRANSACTION コマンドで選択できる唯一のモードです。接続の確立時のみ、他の可能なモードSTATEMENT 、ALTER USER 、またはALTER DATABASE を指定できます。そのモードでは、失敗したSQL ステートメントのみがロールバックされ、トランザクションは通常モードに戻ります。

autosave テストケース

autosave プロパティの値を試すためのテストケースは、 BatchAutoSaveTest.java ファイルで利用できます。次のSQLコードは、サーバーがtransaction_rollback_scope 機能を提供し、autosave=server がJDBC側で使用される場合に予想される動作を示しています。

autosave=server を使用して、次のクエリは値(1) 、(3) 、および(4) を挿入し、duplicate key violation エラーを無視します。

CREATE TABLE test (id INT PRIMARY KEY);
INSERT INTO test VALUES (2);
BEGIN;
INSERT INTO test VALUES (1);
INSERT INTO test VALUES (2);
INSERT INTO test VALUES (3);
INSERT INTO test VALUES (4);
COMMIT;

artifacts ディレクトリには、pgjdbc jarファイルpostgresql-REL2Q.42.2.3.180601.jar が含まれています。このファイルは、通常どおりCLASSPATHに追加する必要があります。また、最新のautosave 機能をテストするために使用できるpostgresql-REL2Q.42.2.3.180601-tests.jar jarも含まれています。

artifacts で提供されるBatchAutoSaveTest.java ファイルは、次のようにテストできます。

  1. CLASSPATHをエクスポートして、テストケースをビルドして実行します。

cd artifacts
export CLASSPATH=$PWD:$PWD/postgresql-REL2Q.42.2.3.180601-tests.jar:$PWD/postgresql-REL2Q.42.2.3.180601.jar:$PWD/junit-4.12.jar:$PWD/hamcrest-core-1.3.jar

1.提供されたテストファイルをコンパイルします。

javac -d . BatchAutoSaveTest.java

1.テストを実行します(ユーザーをtest とし、ローカルホストで実行していると仮定します)。

java -Dusername=test -Dport=5432 -Dhost=localhost -Ddatabase=postgres org.junit.runner.JUnitCore org.postgresql.test.jdbc2.BatchAutoSaveTest
__OUTPUT__
JUnit version 4.12
.Configuration file /Users/altaf/pg/artifacts/../build.properties does not exist. Consider adding it to specify test db host and login
Configuration file /Users/altaf/pg/artifacts/../build.local.properties does not exist. Consider adding it to specify test db host and login
Configuration file /Users/altaf/pg/artifacts/../build.properties does not exist. Consider adding it to specify test db host and login
Configuration file /Users/altaf/pg/artifacts/../build.local.properties does not exist. Consider adding it to specify test db host and login
.........
Time: 0.556

OK (10 tests)

テストケースを変更するには、 artifacts ディレクトリにあるBatchAutoSaveTest.java ファイルを変更します。次に、テストケースをコンパイルして実行します。