パッケージ org.opengion.fukurou.db

## クラス TransactionImpl

- java.lang.Object
- - org.opengion.fukurou.db.TransactionImpl

- すべての実装されたインタフェース:
    `java.lang.AutoCloseable`, `Transaction`
  直系の既知のサブクラス:
    `TransactionReal`

      public class TransactionImpl
      extends java.lang.Object
      implements Transaction

  コネクションを共有して、トランザクションを実現します。 基本的には、TransactionTag で利用されますが、一部、このオブジェクトを 渡して、直接、利用するケースもあります。 トランザクションがすべて完了した後で、realClose() メソッドを呼び出します。 一度でも、rollback が指定されていれば、ロールバックを行い、コネクションを 破棄します。それ以外で、commit が指定されていれば、コミットを行い、 コネクションを、プールに戻します。どちらも指定されていなければ、 コネクションプールに戻すだけになります。 6.3.6.1 (2015/08/28) selectを実行した後で明示的にcommit,rollbackを行わないのはOracle位 らしいので、検索終了時でも、commit か、rollback を行うようにします。 つまり、commit されない(=途中で処理が打ち切られた)場合は、 rollback するように仕様変更しますので、Transactionオブジェクトを 呼び出した処理の最後には、検索であろうとなかろうと、commit()を入れてください。 ただし、Transaction オブジェクトは、DBアクセス以外にも適用可能に 作成しているため、Connection がある場合のみ、実際の commit/rollback が 実行されます。 6.3.6.1 (2015/08/28) 一度、finish() を実行すると、次回実行時にエラーにします。 6.3.9.0 (2015/11/06) synchronized メソッドをsynchronizedブロックに変更。 考え方として、下記のような流れになります。

         Transaction tran = new TransactionImpl/Real( appInfo ) ;
         try {
            ・・・・・
            tran.commit();
         }
         catch( final Exception ex ) {
            tran.rollback();
         }
         finally {
            tran.close();                             // TransactionReal の場合
            tran.finish();                            // TransactionImpl の場合
         }

  6.3.6.1 (2015/08/28) AutoCloseableを使用したtry-with-resources 構文を使用した場合。close/finish 不要。

         try( final Transaction tran = new TransactionImpl/Real( appInfo ) ) {
            ・・・・・
            tran.commit();
         }
         ただし、処理自体がアベンドしないケースでは、rollback() を、自分で呼ぶか、commit() しない(=rollback()される)ようにします。

  変更履歴:
    5.1.9.0 (2010/08/01) 新規作成
  バージョン
    5.0
  作成者
    Kazuhiko Hasegawa
  導入されたバージョン:
    JDK6.0,

- - ### コンストラクタの概要

    コンストラクタ
    コンストラクタ | 説明
    --- | ---
    `TransactionImpl​(ApplicationInfo appInfo)` | ApplicationInfo を指定して作成する、コンストラクター このクラスは、基本的には、TransactionTag クラスから作成されます。

  - ### メソッドの概要

    すべてのメソッド インスタンス・メソッド concreteメソッド
    修飾子とタイプ | メソッド | 説明
    --- | --- | ---
    `void` | `close()` | トランザクションの、終了時処理を行います。
    `void` | `commit()` | コミット処理が行われた場合に、内部フラグ(isCommit)を true にセットします。
    `void` | `endCommit()` | 最終的なコミットが行われた場合に、内部フラグ(isEndCommit)を true にセットします。
    `void` | `finish()` | トランザクションとして、終了時処理を行います。
    `java.sql.Connection` | `getConnection​(java.lang.String dbid)` | 指定のDBID に対応した、Connection オブジェクトを返します。
    `void` | `rollback()` | ロールバック処理が行われた場合に、内部フラグ(isRollback)を true にセットします。

    - ### クラスから継承されたメソッド java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### コンストラクタの詳細

    - #### TransactionImpl

          public TransactionImpl​(ApplicationInfo appInfo)

      ApplicationInfo を指定して作成する、コンストラクター このクラスは、基本的には、TransactionTag クラスから作成されます。
      パラメータ:
        `appInfo` - 内部統制用のアクセス情報

  - ### メソッドの詳細

    - #### getConnection

          public java.sql.Connection getConnection​(java.lang.String dbid)

      指定のDBID に対応した、Connection オブジェクトを返します。 内部Mapに存在していれば、そのコネクションを、存在しなければ、 新しく作成します。
      定義:
        `getConnection` インタフェース内 `Transaction`
      パラメータ:
        `dbid` - 接続先ID
      戻り値:
        指定のDBID に対応した、Connectionオブジェクト
      変更履歴:
        6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD), 6.4.3.4 (2016/03/11) Map#computeIfAbsent で対応する。

    - #### commit

          public void commit()

      コミット処理が行われた場合に、内部フラグ(isCommit)を true にセットします。 １回でもコミットが行われており、ロールバックが行われていなければ、 コミットされます。 検索処理時でも、最後に commit() を実行してください。実行されていない場合は、 自動的に、rollback() が、実行されます。
      定義:
        `commit` インタフェース内 `Transaction`
      変更履歴:
        6.3.6.1 (2015/08/28) AutoCloseable の close() メソッドに対応。return 不要。, 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD)

    - #### rollback

          public void rollback()

      ロールバック処理が行われた場合に、内部フラグ(isRollback)を true にセットします。 １回でもロールバックが行われていれば、最終的にはロールバックされます。 一度も、ロールバックが行われていない場合でも、コミットが行われていない場合は、 rollback()を実行します。
      定義:
        `rollback` インタフェース内 `Transaction`
      変更履歴:
        6.3.6.1 (2015/08/28) AutoCloseable の close() メソッドに対応。return 不要。, 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD)

    - #### close

          public void close()

      トランザクションの、終了時処理を行います。 それまでの処理は、すべて正常に処理できた場合に、使用します。
      定義:
        `close` インタフェース内 `java.lang.AutoCloseable`
      定義:
        `close` インタフェース内 `Transaction`
      関連項目:
        `AutoCloseable.close()`
      変更履歴:
        6.3.6.1 (2015/08/28) AutoCloseable の close() メソッドに対応。return 不要。, 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD)

    - #### endCommit

          public void endCommit()

      最終的なコミットが行われた場合に、内部フラグ(isEndCommit)を true にセットします。 通常は、この処理は、１値度だけ実行されます。 初期値が、false なので、途中で一度でも実行されると、true にセットされ、最後まで 処理されたとみなされてしまうので、注意してください。 通常は、タグリブの、doEndTag() が実行された場合に、呼びます。 このフラグが、true でないと（つまり、一度でも呼ばれないと）最終的に、commit されません。 なお、endCommit() が呼ばれると、自動的に、commit() も呼んでおきます。
      定義:
        `endCommit` インタフェース内 `Transaction`
      変更履歴:
        6.4.3.3 (2016/03/04) 一般的なタグで、SKIP_PAGE された場合、rollback するようにします。

    - #### finish

          public void finish()

      トランザクションとして、終了時処理を行います。 トランザクションがすべて完了した後で、呼び出します。 一度でも、Rollback が指定されていれば、ロールバックを行い、コネクションを 破棄します。それ以外で、Commit が指定されていれば、コミットを行い、 コネクションを、プールに戻します。どちらも指定されていなければ、 コネクションプールに戻すだけになります。
      変更履歴:
        6.3.6.1 (2015/08/28) AutoCloseable の close() メソッドに対応。メソッド名変更。, 6.3.9.0 (2015/11/06) Use block level rather than method level synchronization.(PMD), 6.4.3.4 (2016/03/11) Map#computeIfAbsent で対応する。