検索

9.4. トランザクション伝播ポリシー

download PDF

トランザクションクライアントが新しいトランザクションを作成する方法に影響を与える場合は、JmsTransactionManager を使用してそのトランザクションポリシーを指定できます。特に、Spring トランザクションポリシーを使用すると、トランザクションの伝播動作を指定できます。たとえば、トランザクションクライアントが新しいトランザクションを作成しようとしていて、トランザクションが現在のスレッドにすでに関連付けられていることを検知した場合に、そのまま新しいトランザクションを作成して、古いトランザクションを一時停止するべきですか ?また、既存のトランザクションに引き継がせる必要がありますか。これらの種類の動作は、トランザクションポリシーで伝播動作を指定することによって規制されます。

トランザクションポリシーは、Blueprint XML で Bean としてインスタンス化されます。その後、その Bean IDtransacted() DSL コマンドに引数として指定すると、トランザクションポリシーを参照できます。たとえば、動作 PROPAGATION_REQUIRES_NEW の対象となるトランザクションを開始する場合は、次のルートを使用できます。

from("file:src/data?noop=true")
        .transacted("PROPAGATION_REQUIRES_NEW")
        .bean("accountService","credit")
        .bean("accountService","debit")
        .to("file:target/messages");

PROPAGATION_REQUIRES_NEW 引数は、PROPAGATION_REQUIRES_NEW 動作で設定されるトランザクションポリシー Bean の Bean ID を指定します。「Blueprint XML でのポリシー Bean の定義」を参照してください。

9.4.1. Spring トランザクションポリシー

Apache Camel では、org.apache.camel.spring.spi.SpringTransactionPolicy クラスを使用して Spring トランザクションポリシーを定義できます。これは基本的にネイティブ Spring クラスのラッパーです。SpringTransactionPolicy クラスは以下の 2 つのデータをカプセル化します。

  • PlatformTransactionManager タイプのトランザクションマネージャーへの参照
  • 伝播動作

たとえば、以下のように PROPAGATION_MANDATORY 動作で Spring トランザクションポリシー Bean をインスタンス化できます。

<blueprint ...>
  <bean id="PROPAGATION_MANDATORY "class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="txManager" />
    <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" />
  </bean>
  ...
</blueprint>

9.4.2. 伝播動作の説明

Spring では、以下の伝播動作がサポートされます。これらの値は当初、JavaeEE でサポートされる伝搬動作でモデル化されました。

PROPAGATION_MANDATORY
現在のトランザクションをサポートします。現在のトランザクションが存在しない場合は例外が発生します。
PROPAGATION_NESTED

現在のトランザクションが存在する場合はネストされたトランザクション内で実行し、それ以外の場合は PROPAGATION_REQUIRED のように動作します。

注記

ネストされたトランザクションは、すべてのトランザクションマネージャーでサポートされているわけではありません。

PROPAGATION_NEVER
現在のトランザクションはサポートしません。現在のトランザクションが存在する場合は例外が発生します。
PROPAGATION_NOT_SUPPORTED

現在のトランザクションはサポートしません。常に非トランザクションを実行します。

注記

このポリシーでは、現在のトランザクションを一時停止する必要があります。これは、すべてのトランザクションマネージャーでサポートされているわけではありません。

PROPAGATION_REQUIRED
(デフォルト) 現在のトランザクションをサポートします。存在しない場合は、新しいトランザクションを作成します。
PROPAGATION_REQUIRES_NEW

新しいトランザクションを作成し、現在のトランザクションが存在する場合はそれを一時停止します。

注記

トランザクションの一時停止は、すべてのトランザクションマネージャーでサポートされているわけではありません。

PROPAGATION_SUPPORTS
現在のトランザクションをサポートします。トランザクションが存在しない場合は、非トランザクションを実行します。

9.4.3. Blueprint XML でのポリシー Bean の定義

以下の例は、サポートされるすべての伝播動作に対してトランザクションポリシー Bean を定義する方法を示しています。便宜上、各 Bean ID は、伝播動作値で指定された値と同じですが、実際には、BeanID に任意の値を使用できます。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <bean id="PROPAGATION_MANDATORY " class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_MANDATORY" />
    </bean>

    <bean id="PROPAGATION_NESTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_NESTED" />
    </bean>

    <bean id="PROPAGATION_NEVER" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_NEVER" />
    </bean>

    <bean id="PROPAGATION_NOT_SUPPORTED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_NOT_SUPPORTED" />
    </bean>

    <!-- This is the default behavior. -->
    <bean id="PROPAGATION_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
    </bean>

    <bean id="PROPAGATION_REQUIRES_NEW" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_REQUIRES_NEW" />
    </bean>

    <bean id="PROPAGATION_SUPPORTS" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
        <property name="transactionManager" ref="txManager" />
        <property name="propagationBehaviorName" value="PROPAGATION_SUPPORTS" />
    </bean>

</blueprint>
注記

これらの bean 定義のいずれかを独自の Blueprint XML 設定に貼り付ける場合は、必ずトランザクションマネージャーへの参照をカスタマイズするようにしてください。つまり、txManager への参照をトランザクションマネージャー Bean の実際の ID に置き換えます。

9.4.4. Java DSL の PROPAGATION_NEVER ポリシーを使用したルートの例

トランザクションポリシーがトランザクションに何らかの影響を与えることを示す簡単な方法は、次のルートに示すように、既存のトランザクションの途中に PROPAGATION_NEVER ポリシーを挿入することです。

from("file:src/data?noop=true")
        .transacted()
        .bean("accountService","credit")
        .transacted("PROPAGATION_NEVER")
        .bean("accountService","debit");

このように使用すると、PROPAGATION_NEVER ポリシーはすべてのトランザクションを必然的に中止し、トランザクションのロールバックにつながります。アプリケーションへの影響を簡単に確認できるはずです。

注記

transacted() に渡される文字列の値は Bean ID で、伝播の動作名ではないことに注意してください。この例では、Bean ID が伝播動作名と同じになるように選択されますが、必ずしもそうである必要はありません。たとえば、アプリケーションで複数のトランザクションマネージャーを使用している場合、特定の伝播動作を持つ複数のポリシー Bean が作成される可能性があります。この場合、伝播の動作の後に Bean の名前を付けることはできませんでした。

9.4.5. Blueprint XML で PROPAGATION_NEVER ポリシーを使用したルートの例

上記のルートは、以下のように Blueprint XML で定義できます。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
            <from uri="file:src/data?noop=true" />
            <transacted />
            <bean ref="accountService" method="credit" />
            <transacted ref="PROPAGATION_NEVER" />
            <bean ref="accountService" method="debit" />
        </route>
    </camelContext>

</blueprint>
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.