JDBC properties for setting rollback scope#

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

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

autosave#

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 機能を提供し、JDBC側でautosave=server が使用される場合に予想される動作を示しています。

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 ファイルを変更できます。次に、テストケースをコンパイルして実行します。