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