---
schema_version: "1"
id: c5fe389f262bf3aa86c6c5e9759da9b5ea6567a025ce8b3341d480d4f8bf0f1f
title: Transactions
collection: mulesoft
version: current
locale: ja-jp
portal_url: https://docs.salesforce.com/mulesoft/current/ja-jp/mule-sdk/1.1/transactions.md
canonical_url: https://docs.mulesoft.com/jp/mule-sdk/1.1/transactions
source_site: docs.mulesoft.com
content_type: documentation
content_hash: fa184422c0d94813165e33a0a159cc2378d3bba4b7fd7396ff3eee11b9b13a81
description: MuleSoft Documentation Site
release: "1.1"
latest: false
---
# Transactions

SDK では、Mule フロー内でトランザクションへの結合と新規トランザクションの作成を行うコネクタを作成できます。これには、1 つの単位として機能する、ソースと操作の実行が含まれます。つまり、フロー内で問題が発生した場合、トランザクションに参加しているすべてのコンポーネントが 1 つの単位としてその実行をロールバックします。一部だけで部分的な完了とならないようにトランザクション内のすべての操作がロールバックされます。

## [](#コネクタへのトランザクションの実装)コネクタへのトランザクションの実装

Mule のトランザクションサポートは、キーにより識別されるトランザクションリソースに基づいて機能します。SDK はこの同じ概念、すなわち接続の抽象化を再利用し、コンポーネントの接続をトランザクションのキーとして使用するという概念を踏襲します。

`ConnectionProvider`​ が ​`TransactionalConnection`​ インターフェースのインスタンスを生成するため、トランザクションを持つには拡張機能に ​`ConnectionProvider`​ が必要です。

### [](#transactionalconnection-インターフェース)TransactionalConnection インターフェース

コネクタでトランザクションを有効にするには、接続プロバイダー (​[`ConnectionProvider`](https://docs.mulesoft.com/jp/mule-sdk/1.1/connections)​) が必要です。この接続プロバイダーが、​`TransactionalConnection`​ インターフェースを実装する接続を提供します。

接続では、トランザクションの開始と結果を伝達するために使用する ​`TransactionalConnection`​ メソッドを実装する必要があります。

```java
public class TXConnectionProvider implements ConnectionProvider<TXConnection> {
  ...
}
```

```java
public class TxConnection implements TransactionalConnection {

    @Override
    public void begin() throws TransactionException {
        //logic to begin a transaction
    }

    @Override
    public void commit() throws TransactionException {
        //logic to commit a transaction

    }

    @Override
    public void rollback() throws TransactionException {
        //logic to rollback a transaction
    }
}
```

このインターフェースを実装するには、次のメソッドを実装する必要があります。

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Method (メソッド)</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>begin()</code>​</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">トランザクションを開始する必要がある場合、このメソッドをコールします。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>commit()</code>​</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">トランザクションが正しく終了し、トランザクションをコミットする必要がある場合、これをコールします。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>rollback()</code>​</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">トランザクションがエラーで終了し、トランザクションをロールバックする必要がある場合、これをコールします。</p></td>
</tr>
</tbody>
</table>

### [](#操作でのトランザクション)操作でのトランザクション

操作をトランザクションの下で動作させるには、​`@Connection`​ パラメーターがトランザクション対応の接続、つまり ​`TransactionalConnection`​ を実装する接続である必要があります。

#### [](#トランザクションのアクション)トランザクションのアクション

操作がトランザクション型の場合、​`transactionalAction`​ という名前の合成パラメーターが操作に自動的に追加されます。このパラメーターは、次の値を取る可能性がある Enum (列挙) 型です。

<table class="tableblock frame-all grid-all fit-content spread">
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">アクション名</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>ALWAYS_JOIN</strong>​</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">コネクタは常に既存のトランザクションに結合します。トランザクションがないか、現在のトランザクションに現在の操作との互換性がない場合、操作の実行は失敗します。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>JOIN_IF_POSSIBLE</strong>​ (デフォルト)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">トランザクションを使用できる場合、そのトランザクションを使用します。それ以外の場合、処理を続行します。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><strong>NOT_SUPPORTED</strong>​</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">操作は、実行中のトランザクションの外側で実行されます。</p></td>
</tr>
</tbody>
</table>

```xml
<try transactionalAction="BEGIN_OR_JOIN">
  <transactional-connector:work config-ref="config"
    transactionalAction="ALWAYS_JOIN"/>
</try>
```

##### [](#操作コード内の操作のトランザクションアクション)操作コード内の操作のトランザクションアクション

場合によって、Mule アプリケーション内で ​`transactionalAction`​ がどの操作レベルで設定されているかを把握することが必要になる場合があります。これを行うには、使用された値を挿入するように ​`OperationTransactionalAction`​ 型のパラメーターを設定することができます。

```java
public void work(@Connection TxConnection connection, OperationTransactionalAction action) {
  //
}
```

#### [](#操作のトランザクションの使用方法)操作のトランザクションの使用方法

操作はトランザクションを開始できません。トランザクションは​[メッセージソース](https://docs.mulesoft.com/jp/mule-sdk/1.1/sources)​によって開始できます。また、操作は、新しいトランザクションを開始する ​`<try />`​ スコープの内側に入っている必要があります。

トランザクション型操作を実行する前に、Mule は現在のトランザクションに、バインドされたキーがあるかどうかを確認します。

- バインドされたキーがすでにある場合 (以前の操作またはソースによりすでに登録されているため)、Mule は、現在の操作との互換性があるかどうかを確認します。互換性がある場合、操作は、バインドされた接続を使用します。 それ以外の場合、実行フローが失敗し、現在の操作が互換性のないトランザクションに入ろうとしたことが示されます。
- バインドされたキーがない場合、操作の接続がキーとしてバインドされ、​`TransactionalConnection.begin()`​ が実行されて、現在の操作のトランザクションを開始する必要があることが通知されます。

トランザクションスコープ (つまり、​`<try />`​ スコープ、またはトランザクションが​[メッセージソース](https://docs.mulesoft.com/jp/mule-sdk/1.1/sources)​により初期化されている場合はフロー全体) の実行の最後で、トランザクションが正しく終了している場合、Mule は ​`TransactionalConnection.commit()`​ をコールします。エラーが発生している場合は、​`TransactionalConnection.rollback()`​ を実行します。

接続がトランザクションに結合すると、プロバイダーの接続管理戦略が上書きされます。つまり、接続の戦略に関係なく、トランザクションのスコープ内のすべての一致する操作で同じ接続が使用されます。

<table><tbody><tr><td class="icon"><i class="fa icon-warning" title="Warning"></i></td><td class="content">この動作は ​<code>CachedConnectionProvider</code>​ の概念に完全に一致するわけではありません。同じ接続が、異なるトランザクションに同時に結合できるためです。そのため、同じ接続内で異なるトランザクションを同時に管理する方法をユーザーが認識しておく必要があります。 トランザクションと共に ​<code>CachedConnectionProviders</code>​ を使用することは極力お勧めしません。</td></tr></tbody></table>

### [](#ソースでのトランザクション)ソースでのトランザクション

操作をトランザクションの下で動作させるには、​`@Connection`​ パラメーターが、トランザクション互換性のある接続を提供できる ​`ConnectionProvider`​ である必要があります。

#### [](#トランザクションのアクション-2)トランザクションのアクション

##### [](#ソースのトランザクションアクション)ソースのトランザクションアクション

メッセージソースがトランザクションの場合、​`transactionalAction`​ という名前の合成パラメーターが自動的に追加されます。このパラメーターは、次の値を取る可能性がある Enum (列挙) 型です。

<table class="tableblock frame-all grid-all fit-content spread">
<caption class="title">Table 1. ソースのトランザクションアクション</caption>
<colgroup>
<col>
<col>
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">アクション名</th>
<th class="tableblock halign-left valign-top">説明</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">ALWAYS BEGIN (常に開始)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">呼び出しごとに新しいトランザクションが必ず作成されます。</p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">NONE (なし) (デフォルト)</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ソースはトランザクションを開始せず、フロー内で開かれているトランザクションに参加しません。</p></td>
</tr>
</tbody>
</table>

##### [](#操作コード内のソースのトランザクションアクション)操作コード内のソースのトランザクションアクション

場合によって、Mule アプリケーション内で ​`transactionalAction`​ がどのソースレベルで設定されているかを把握することが必要になる場合があります。この場合、使用された値を挿入するように ​`SourceTransactionalAction`​ 型のパラメーターを定義することができます。次に例を示します。

ソースへの SourceTransactionalAction の挿入

```java
public class TransactionalSource extends Source<String, Void> {

  @Connection
  private ConnectionProvider<TXConnection> connection;

  @Parameter
  private SourceTransactionalAction action;

  // rest of the code
}
```

このトピックの詳細は、​[ソーストランザクション](https://docs.mulesoft.com/jp/mule-sdk/1.1/sources-transactions)​についての説明を参照してください。

### [](#xa-トランザクション)XA トランザクション

XA トランザクションは同様の方法でサポートされます。唯一の違いは、プロバイダーが ​`TransactionalConnection`​ の代わりに ​`XATransactionalConnection`​ を返すことです。これは、​`XAResource`​ を返すことができる接続です。