データベーストランザクションの設定の例 - Mule 4

データベース用 Anypoint Connector (Database Connector) を使用すると、トランザクションのコンテキストでデータベース操作を実行できます。各操作に ​[Transactional action (トランザクションアクション)]​ 項目があります。この項目を使用して、アクティブなトランザクションに関して、操作で実行できる結合アクションの種別を指定します。

次の例は、Studio で ​[Transactional action (トランザクションアクション)]​ 項目を設定する方法 (​Select​ 操作の場合と、​Try​ スコープコンポーネントを使用して操作をグループ化する場合の両方) を示しています。

Studio で [Transactional Action (トランザクションアクション)] 項目を設定する

項目を設定する手順は、次のとおりです。

  1. Studio のフローで、​[Select]​ 操作を選択します。

  2. コネクタ設定画面で、​[Advanced (詳細)]​ タブをクリックします。

  3. [Transactional action (トランザクションアクション)]​ 項目を次のいずれかのオプションに設定します。

    • ALWAYS_JOIN
      メッセージの受信時にトランザクションが進行中であると想定します。トランザクションがない場合、エラーが発生します。

    • JOIN_IF_POSSIBLE
      現在のトランザクションが使用可能な場合、そのトランザクションを結合します。それ以外の場合、トランザクションは実行されません。

    • NOT_SUPPORTED
      存在するトランザクションの外部で実行します。

次のスクリーンショットは、Studio の設定を示しています。

Studio での [Transactional action (トランザクションアクション)] 項目の設定
Figure 1. [Transactional action (トランザクションアクション)] の設定

XML エディターでは、​transactionalAction​ 設定は次のように記述されます。

<db:select doc:name="Select" transactionalAction="ALWAYS_JOIN">
			<db:sql ><![CDATA[SELECT * FROM PLANET WHERE name = :name]]></db:sql>
</db:select>

Try スコープの [Transactional Action (トランザクションアクション)] 項目を設定して操作をグループ化する

場合によっては、複数のクエリを同じトランザクションのコンテキストでアトミックに実行する必要があります。これらのクエリを、すでに存在するトランザクションのコンテキストで実行した場合、クエリは同じトランザクションに属します。

次の例は、銀行口座振替中に 2 つの Database Connector の ​Update​ 操作を使用して、1 つの口座から金額を引き、別の口座に加えるが、この 2 つの操作のいずれかが失敗した場合、両方の操作をロールバックすることを示しています。アクティブなトランザクションがない場合は、​Try​ スコープコンポーネントを使用して操作をグループすることでトランザクションを開始できます。

  1. [Mule Palette (Mule パレット)]​ ビューで「​try​」を検索し、​[Try]​ スコープコンポーネントを選択します。

  2. [Try]​ スコープコンポーネントを Studio キャンバスにドラッグします。

  3. [Update]​ 操作を ​[Try]​ スコープコンポーネントの内部にドラッグします。

  4. 操作の設定画面の ​[General (一般)]​ タブで、​[Connector configuration (コネクタ設定)]​ 項目の横にあるプラス記号 (​+​) をクリックし、グローバル要素設定項目にアクセスします。

  5. データベース接続情報を指定し、​[OK]​ をクリックします。

  6. 実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します (例: UPDATE ACCOUNT set BALANCE = BALANCE - :money where ID = :source​)。

  7. [Input Parameters (入力パラメーター)]​ 項目を ​{‘money’ : payload.money, ‘source’: payload.source}​ に設定します。

  8. 別の ​[Update]​ 操作を ​[Try]​ コンポーネント内の最初の ​[Update]​ 操作の右にドラッグします。

  9. [Connector configuration (コネクタ設定)]​ 項目を、以前に作成したデータベース接続に設定します。

  10. 実行する SQL クエリを ​[SQL Query Text (SQL クエリテキスト)]​ 項目に設定します (例: UPDATE ACCOUNT set BALANCE = BALANCE + :money where ID = :target​)。

  11. [Input Parameters (入力パラメーター)]​ 項目を ​{‘money’ : payload.money, ‘target’’: payload.target}​ に設定します。

  12. フローの ​[Try]​ スコープコンポーネントを選択します。

  13. コンポーネント設定画面で、​[Transactional action (トランザクションアクション)]​ 項目を ​ALWAYS_BEGIN​ に設定します。

次のスクリーンショットは、Studio の設定を示しています。

Studio での Try コンポーネントの [Transactional action (トランザクションアクション)] 項目の設定
Figure 2. [Transactional action (トランザクションアクション)] の設定

XML エディターでは、​transactionalAction​ 設定は次のように記述されます。

<try transactionalAction="ALWAYS_BEGIN">
 <db:update config-ref="db">
   <db:sql>UPDATE ACCOUNT set BALANCE = BALANCE - :money where ID = :source</db:sql>
   <db:input-parameters>#[{'money' : payload.money, 'source': payload.source}]</db:input-parameters>
 </db:update>

 <db:update config-ref="db">
   <db:sql>UPDATE ACCOUNT set BALANCE = BALANCE + :money where ID = :target</db:sql>
   <db:input-parameters>#[{'money' : payload.money, 'target'': payload.target}]</db:input-parameters>
 </db:update>
</try>

トランザクションとストリーミング

一部の Database Connector 操作 (​Select​ 操作など) の結果は、自動的にストリーミングされ、すべての結果が一度に読み込まれることでパフォーマンスとメモリの問題が発生することを防止します。この動作は、データベース行が必要に応じて遅延して読み込まれることを意味します。 Database Connector 操作がトランザクション (​Try​ スコープコンポーネントなど) の内部で実行されて、データがコンシュームされる前にトランザクションが終了した場合、読み込まれていない結果にアクセスしようとするとエラーとなります。