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