7.13.1 トランザクション・イニシエータとしてのNode.jsアプリケーションの構成

トランザクション・イニシエータ・サービスは、トランザクションを開始します。トランザクション・イニシエータ・サービスは、アプリケーションのビジネス・ロジックに基づいて、トランザクションの開始のみ、またはトランザクションの開始とトランザクションへの参加を行うことができます。

開始する前に、アプリケーションがトランザクションを開始するだけか、トランザクションを開始して参加するのかを確認します。2つのシナリオでは要件が若干異なるため、それに応じてアプリケーションを構成します。

2つのシナリオを検討して、アプリケーションがトランザクションを開始するだけか、トランザクションにも参加するかを理解します。
  • シナリオ1: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。この場合、振込アプリケーションはトランザクションを開始するだけで、トランザクションには参加しません。振込アプリケーションは、トランザクションを完了するためにビジネス・ロジックに基づいて様々なサービスをコールします。データベース・インスタンスは、振込アプリケーションにアタッチされる場合とアタッチされない場合があります。
  • シナリオ2: 銀行振込アプリケーションによって、ある部門から別の部門に送金します。振込アプリケーションは、トランザクションごとに手数料として1%を請求します。この場合、振込アプリケーションはトランザクションを開始して参加します。データベース・インスタンスは、トランザクション情報を保存するために振込アプリケーションにアタッチされる必要があります。
Node.jsアプリケーションをトランザクション・イニシエータとして構成するには:
  1. Node.jsのMicroTxライブラリをpackage.jsonファイルに依存関係として追加します。
    "dependencies": {
        "@oracle/microtx": "<version>"
      }

    ここで、<version>は、Node.jsのMicroTxライブラリの最新バージョンです。

  2. MicroTxライブラリのプロパティ値を構成します。「JAX-RSおよびNode.jsアプリケーションのライブラリ・プロパティの構成」を参照してください。Node.jsアプリケーションのロギングを有効にするには、追加のプロパティを設定する必要があります。「MicroTx Node.jsライブラリのログの有効化」を参照してください。
  3. プロパティ値を定義したtmm.propertiesファイルを渡して、マイクロサービスのMicroTxライブラリ・プロパティを構成します。
    TrmConfig.init('./tmm.properties');
  4. アプリケーション・コードを編集します:
    1. TrmUserTransactionオブジェクトを作成します。
    2. トランザクションを開始するために、作成したTrmUserTransactionオブジェクトに対してbegin()をコールします。begin()をコールするときに渡すパラメータは、アプリケーションがトランザクションを開始するだけか参加もするかによって異なります。
    3. トランザクションをコミットまたはロールバックするために、作成したTrmUserTransactionオブジェクトに対してcommit()またはrollback()をコールします。

    次の例は、utという名前のTrmUserTransactionオブジェクトを作成し、トランザクションを開始してからコミットまたはロールバックする方法を示しています。ここで、reqはリクエストを表します。

    //Step 3(a): Create a TrmUserTransaction object
    let ut: TrmUserTransaction = newTrmUserTransaction();
    
    //Optional. Specify the amount of time, in milliseconds, for which the transaction remains active. 
    //If a transaction is not committed or rolled back within the specified time period, the transaction is rolled back.
    ut.setTransactionTimeout(60000);
    
    try {
      //Step 3(b): Transaction demarcation - (start)
      await ut.begin(req);  //If your application only initiates the transaction and does not participate in it.
      await ut.begin(req, true);  //If your application initiates the transaction and participates in it.
    
      ... // implement business logic
      
      await ut.commit(req); //Step 3(c): Transaction demarcation - commit (end)
    
      resp.status(200).send("Transaction complete.");
    } 
    catch (e) {
      console.log("Transaction Failed: ", e);
      let message = e.message;
      try {
        console.log("Rollback on transaction failure.");
        await ut.rollback(req); //Step 3.c: Transaction rollback (end)
        message = message + ". Transaction rolled back. ";
      } catch (ex) {
        console.log("Error in rollback for transfer failure: ", ex);
      }
      resp.status(500).send(message);
    }

    例のコードは、try-catch文に実装されているため、エラーがあっても正常に処理されます。try-catch文を使用せずにサンプル・コードを実装することもできます。

  5. 変更内容を保存してからアプリケーションをデプロイします。アプリケーションのデプロイを参照してください。

イニシエータ・サービスが、トランザクションを開始するだけでなくトランザクションに参加する場合、トランザクションに参加してリソース・マネージャと通信するアプリケーションのために追加の構成を行う必要があります。トランザクション参加側としてのNode.jsアプリケーションの構成を参照してください。

MicroTxライブラリおよびXAを使用するサンプルSpring RESTトランザクション・イニシエータ・アプリケーションのソース・コードは、microtx-samples GitHubリポジトリにあるtellerフォルダにあります。これは、MicroTxライブラリとアプリケーションの統合時に参照として使用できます。これは、Spring RESTイニシエータ・アプリケーションのビジネス・ロジックでMicroTx Spring RESTライブラリを使用する方法の例です。このサンプル・アプリケーションは振込(Teller)という名前です。これは2つの部門間のトランザクションを開始します。部門Aをコールして一定金額を引き出し、部門Bをコールして預け入れます。