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``
エラーを無視します。

.. code:: sql

   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をエクスポートしてテストケースをビルドおよび実行します。

.. code:: sh

      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.提供されたテストファイルをコンパイルします。

.. code:: sh

      javac -d . BatchAutoSaveTest.java

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

.. code:: shell

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