第13章 トランザクションの設定

13.1. Transactions サブシステムの設定

13.1.1. トランザクションマネージャーの設定

トランザクションマネージャーは、Web ベースの管理コンソールまたはコマンドライン管理 CLI を使用して設定できます。

管理コンソールを使用したトランザクションマネージャーの設定

以下の手順は、Web ベースの管理コンソールを使用してトランザクションマネージャーを設定する方法を示しています。

  1. 画面上部の Configuration タブを選択します。
  2. JBoss EAP を管理対象ドメインとして実行している場合は、変更する任意のプロファイルを選択します。
  3. Subsystem リストから、Transactions を選択し、View をクリックします。
  4. 編集する設定に応じたタブ (リカバリーオプションの場合の Recovery など) で Edit をクリックします。
  5. 必要な変更を行い、Save をクリックして変更を保存します。
  6. ヘルプ をクリックしてヘルプテキストを表示します。
管理 CLI を使用したトランザクションマネージャーの設定

管理 CLI で一連のコマンドを使用してトランザクションマネージャーを設定できます。これらのコマンドはすべて /subsystem=transactions (スタンドアロンサーバー向け) または /profile=default/subsystem=transactions/ (管理対象ドメインの default プロファイル向け) で始まります。

トランザクションマネージャーのすべての設定オプションの詳細なリストについては、「トランザクションマネージャーの設定オプション」を参照してください。

13.1.2. システムプロパティーを使用したトラザクションマネージャーの設定

トランザクションマネージャーのオプションは管理コンソールまたは管理 CLI を使用して設定できますが、多くのトランザクションマネージャーのオプションはシステムプロパティーを使用して設定することも可能です。

以下は、システムプロパティーを使用してのみ設定できるオプションです。管理 CLI や管理コンソールを使用して設定できません。

プロパティー名説明

RecoveryEnvironmentBean.periodicRecoveryPeriod

リカバリーを試行する間隔 (秒単位)。

  • 正の整数である必要があります。
  • デフォルトは 120 秒 (2 分) です。

RecoveryEnvironmentBean.recoveryBackoffPeriod

最初と 2 度目のリカバリーパスの間隔 (秒単位)。

  • 正の整数である必要があります。
  • デフォルトは 10 秒です。

RecoveryEnvironmentBean.periodicRecoveryInitializationOffset

最初のリカバリーパスより前の間隔 (秒単位)。

  • 0 または正の整数である必要があります。
  • デフォルトは 0 秒です。

RecoveryEnvironmentBean.expiryScanInterval

期限切れスキャンの間隔 (時間単位)。

  • 整数値である必要があります。
  • 0 はスキャンを無効にします。
  • 負の値は、最初の実行を遅延します。
  • デフォルトは 12 時間です。

以下は、standalone.xml サーバー設定ファイルに設定されたシステムプロパティーの例になります。

<system-properties>
    <property name="RecoveryEnvironmentBean.periodicRecoveryPeriod" value="180"/>
    <property name="RecoveryEnvironmentBean.recoveryBackoffPeriod" value="20"/>
    <property name="RecoveryEnvironmentBean.periodicRecoveryInitializationOffset" value="5"/>
    <property name="RecoveryEnvironmentBean.expiryScanInterval" value="24"/>
</system-properties>

システムプロパティーの設定方法の詳細は、「システムプロパティー」を参照してください。

13.1.3. JTA を使用するようデータソースを設定

ここでは、データソースで Java Transaction API (JTA) を有効にする方法を説明します。

前提条件
  • データベースが Java Transaction API をサポートする必要があります。不明な場合は、データベースのドキュメントを参照してください。
  • 非 XA データソース を作成します。

    注記

    XA データソース はすでにデフォルトで JTA が有効になっています。

Java Transaction API を使用するようデータソースを設定
  1. 以下の管理 CLI コマンドを使用して jta 属性を true に設定します。

    /subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=jta,value=true)
    注記

    管理対象ドメインでは、このコマンドの前に /profile=PROFILE_NAME を付けます。

  2. 変更を反映するためにサーバーをリロードします。

    reload

データソースが JTA を使用するように設定されます。

13.1.4. トランザクションログメッセージ

トランザクションロガーに DEBUG ログレベルを使用することにより、ログファイルを読み取り可能な状態に保ちつつトランザクションを追跡できます。詳細なデバッグの場合は、TRACE ログレベルを使用します。トランザクションロガーの設定に関する詳細については、「Transactions サブシステムのロギング設定」を参照してください。

TRACE ログレベルでログを記録するよう設定すると、トランザクションマネージャー (TM) は多くのロギング情報を生成できます。最も一般的なメッセージの一部は次のとおりです。このリストは包括的ではなく、他のメッセージが表示されることもあります。

表13.1 トランザクション状態の変更

トランザクションの開始

トランザクションが開始されたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Begin が実行され、メッセージ BasicAction::Begin() for action-id <transaction uid> でログに示されます。

トランザクションのコミット

トランザクションがコミットされたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Commit が実行され、メッセージ BasicAction::Commit() for action-id <transaction uid> でログに示されます。

トランザクションのロールバック

トランザクションがロールバックされたら、クラス com.arjuna.ats.arjuna.coordinator.BasicAction のメソッド Rollback が実行され、メッセージ BasicAction::Rollback() for action-id <transaction uid> でログに示されます。

トランザクションのタイムアウト

トランザクションがタイムアウトすると、com.arjuna.ats.arjuna.coordinator.TransactionReaper のメソッド doCancellations が実行され、Reaper Worker <thread id> attempting to cancel <transaction uid> とログに示されます。この結果、上記のように同じスレッドがトランザクションをロールバックすることが示されます。

13.1.5. Transactions サブシステムのロギング設定

JBoss EAP の他のログ設定に依存せずにログに記録されたトランザクションに関する情報の量を制御できます。ログ設定は、管理コンソールまたは管理 CLI を使用して設定できます。

管理コンソールを使用したトランザクションロガーの設定
  1. Logging サブシステム設定に移動します。

    1. 管理コンソールで、Configuration タブをクリックします。管理対象ドメインを使用する場合は、最初に適切なサーバープロファイルを選択する必要があります。
    2. Logging サブシステムを選択し、View をクリックします。
  2. com.arjuna 属性を編集します。

    Log Categories タブを選択します。com.arjuna エントリーがすでに存在します。com.arjuna を選択し、属性セクションの Edit をクリックします。ログレベルを変更し、親ハンドラーを使用するかどうかを選択できます。

    • ログレベル:

      トランザクションにより大量のロギング出力が生成されることがあるため、サーバーのログがトランザクション出力で満たされないようデフォルトのロギングレベルは WARN に設定されます。トランザクション処理の詳細を確認する必要がある場合は、トランザクション ID が表示されるよう TRACE ログレベルを使用します。

    • 親ハンドラーの使用:

      親ハンドラーはロガーが出力を親ロガーに送信するかどうかを指定します。デフォルトの動作は true です。

  3. Save をクリックして変更を保存します。
管理 CLI を使用したトランザクションロガーの設定

以下のコマンドを使用して管理 CLI からログレベルを設定します。スタンドアロンサーバーの場合は、コマンドから /profile=default を削除します。

/profile=default/subsystem=logging/logger=com.arjuna:write-attribute(name=level,value=VALUE)

13.1.6. Transactions サブシステムの調整

transactions サブシステムのパフォーマンスを最適化するための情報は、『Performance Tuning Guide』の「Transactions Subsystem Tuning」を参照してください。

13.2. トランザクション管理

13.2.1. トランザクションの参照と管理

管理 CLI では、トランザクションレコードを参照および操作する機能がサポートされます。この機能は、TM と JBoss EAP の管理 API 間の対話によって提供されます。

TM は、待機中の各トランザクションとトランザクションに関連する参加者に関する情報を、オブジェクトストアと呼ばれる永続ストレージに格納します。管理 API は、オブジェクトストアを log-store と呼ばれるリソースとして公開します。probe 操作はトランザクションログを読み取り、各レコードに対してノードパスを作成します。probe コマンドは、log-store を更新する必要があるときに、いつでも手動で呼び出すことができます。トランザクションログが即座に表示され非表示になるのは、正常な挙動です。

ログストアの更新

以下のコマンドは、管理対象ドメインでプロファイル default を使用するサーバーグループに対してログストアを更新します。スタンドアローンサーバーの場合は、コマンドから profile=default を削除します。

/profile=default/subsystem=transactions/log-store=log-store:probe
準備済みトランザクションすべての表示

準備されたすべてのトランザクションを表示するには、最初に ログストアを更新 し、ファイルシステムの ls コマンドに類似した機能を持つ次のコマンドを実行します。

ls /profile=default/subsystem=transactions/log-store=log-store/transactions

または

/host=master/server=server-one/subsystem=transactions/log-store=log-store:read-children-names(child-type=transactions)

各トランザクションが一意の識別子とともに表示されます。個々の操作は、各トランザクションに対して実行できます。詳細は、「トランザクションの管理」を参照してください。

13.2.1.1. トランザクションの管理

トランザクションの属性の表示

JNDI 名、EIS 製品名およびバージョン、状態などのトランザクションに関する情報を表示するには、read-resource 操作を使用します。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-resource
トランザクション参加者の詳細の表示

各トランザクションログには、participants (参加者) と呼ばれる子要素が含まれます。トランザクションの参加者の詳細を確認するには、この要素に read-resource 操作を使用します。参加者は JNDI 名によって識別されます。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=java\:\/JmsXA:read-resource

結果は以下のようになります。

{
   "outcome" => "success",
   "result" => {
       "eis-product-name" => "ActiveMQ",
       "eis-product-version" => "2.0",
       "jndi-name" => "java:/JmsXA",
       "status" => "HEURISTIC",
       "type" => "/StateManager/AbstractRecord/XAResourceRecord"
   }
}

ここで示された結果は HEURISTIC 状態であり、リカバリーが可能です。詳細は、「トランザクション参加者のリカバリー」を参照してください。

特別な場合では、ログに対応するトランザクションレコードがないオーファンレコード (XAResourceRecords) をオブジェクトストアに作成できます。たとえば、準備済みの XA リソースが TM が記録する前にクラッシュした場合や、ドメイン管理 API では XA リソースにアクセスできない場合などがこれに該当します。このようなレコードにアクセスするには、管理オプション expose-all-logstrue に設定する必要があります。このオプションは管理モデルには保存されず、サーバーが再起動されると false に戻ります。

/profile=default/subsystem=transactions/log-store=log-store:write-attribute(name=expose-all-logs, value=true)

代わりに以下のコマンドを実行すると、トラザクション参加者 ID が集約され表示されます。

/host=master/server=server-one/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:read-children-names(child-type=participants)
トランザクションの削除

各トランザクションログは、トランザクションを表すトランザクションログを削除する delete 操作をサポートします。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9:delete

これにより、トランザクションのすべての参加者も削除されます。

警告

通常、参加者のログ管理はリカバリーシステムまたはそれを所有するトランザクションログに任せますが、delete 操作はその操作を安全に実行できる場合に使用できます。XA リソースがヒューリスティックに完了すると、forget の呼び出しが発生し、XA リソースベンダーのログは適切に消去されます。この forget 呼び出しに失敗しても、デフォルトでは delete 操作は正常に行われます。この挙動をオーバーライドするには、ObjectStoreEnvironmentBean.ignoreMBeanHeuristics システムプロパティーを false に設定します。

トランザクション参加者のリカバリー

トラザクションの各参加者は、recover 操作を使用したリカバリーをサポートします。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:recover

トランザクション参加者の状態が HEURISTIC である場合、recover 操作は状態を PREPARE に切り替え、周期リカバリープロセスにコミットを再生するよう要求します。

コミットに成功すると、参加者はトランザクションログから削除されます。これを検証するには、log-storeprobe 操作を実行し、参加者がリストされていないことを確認します。最後の参加者が削除されると、トランザクションも削除されます。

トランザクション参加者の状態の更新

トランザクションをリカバリーする必要がある場合は、リカバリーを試行する前に refresh 操作を使用して、トランザクションのリカバリーが必要であるかを確認できます。

/profile=default/subsystem=transactions/log-store=log-store/transactions=0\:ffff7f000001\:-b66efc2\:4f9e6f8f\:9/participants=2:refresh
注記

JBoss EAP 7.0 では、トランザクション失敗の例外はシリアライズされ、クライアントに渡されます。クラスパスに例外クラスがない場合は、クライアントに対して ClassNotFoundException が発生します。

JBoss EAP 7.1 には、org.wildfly.common.rpc.RemoteExceptionCause 例外が導入されました。クライアントはこれを wildfly ライブラリーからの例外として認識します。サーバーは元の例外をこの新しい例外としてクローンし、元の例外のすべてのフィールドを文字列フォームに配置し、例外のメッセージに追加します。その後、サーバーは RemoteExceptionCause の例外のみをクライアントに渡します。

13.2.2. トランザクション統計情報の表示

トランザクションマネージャーの統計が有効になっていると、トランザクションマネージャーによる処理されたトラザクションの統計を表示できます。トランザクションマネージャーの統計を有効にする方法については、「トランザクションマネージャーの設定」を参照してください。

管理コンソールまたは管理 CLI を使用して統計を表示できます。管理コンソールでは、Runtime タブから Transactions サブシステムを選択するとトラザクションの統計を表示できます。管理 CLI では、read-resource 操作に include-runtime=true を使用すると統計を表示できます。例を以下に示します。

/subsystem=transactions:read-resource(include-runtime=true)

以下の表は、管理コンソールの表示名、管理 CLI の属性、および各トラザクション統計の説明を示しています。

表13.2 Transactions サブシステムの統計

表示名属性説明

Aborted

number-of-aborted-transactions

中止したトランザクションの数。

Application Failures

number-of-application-rollbacks

失敗の原因がアプリケーションだった、タイムアウトを含む失敗したトランザクションの数。

Average Commit Time

average-commit-time

トランザクションコミットの平均時間 (ナノ秒単位)。クライアントがコミットを呼び出したときからトランザクションマネージャーがコミットの成功を判断するまで測定されます。

Committed

number-of-committed-transactions

コミットされたトランザクションの数。

Heuristics

number-of-heuristics

ヒューリスティック状態のトランザクションの数。

Inflight Transactions

number-of-inflight-transactions

開始済みであるが終了されていないトランザクション数。

Nested Transactions

number-of-nested-transactions

作成済みのネストされたトランザクションの総数。

Number of Transactions

number-of-transactions

ネストされたトランザクションを含む、作成済みのトランザクションの総数。

Resource Failures

number-of-resource-rollbacks

障害の原因がリソースであった失敗トランザクションの数。

System Failures

number-of-system-rollbacks

内部システムエラーが原因で、ロールバックされたトランザクションの数。

Timed Out

number-of-timed-out-transactions

タイムアウトが原因で、ロールバックされたトランザクションの数。

13.2.3. トランザクションオブジェクトストア

トランザクションにはオブジェクトを保存する場所が必要です。オブジェクトストレージのオプションの 1 つが JDBC データソースです。特にパフォーマンスが気になる場合、JDBC オフジェクトストアはファイルシステムまたは ActiveMQ ジャーナルオブジェクトストアよりも速度が遅くなる場合があります。

重要

トラザクションログのストレージタイプとして Apache ActiveMQ Artemis ジャーナルを使用するよう transactions サブシステムが設定されている場合、JBoss EAP の 2 つのインスタンスは同じディレクトリーを使用してジャーナルを保存することはできません。アプリケーションサーバーインスタンスは同じ場所を共有することはできず、アプリケーションサーバーインスタンスごとに一意な場所を設定する必要があります。

注記

トランザクションオブジェクトストアがないと、データの一貫性を保てなくなる可能性があります。そのため、オブジェクトストアを 安全な ドライブに配置する必要があります。

JDBC データソースをトランザクションオブジェクトストアとして使用

JDBC データソースをトランザクションオブジェクトストアとして使用するには、以下の手順に従います。

  1. データソース (例: TransDS) を作成します。手順は「非 XA データソースの作成」を参照してください。データソースの JDBC ドライバーは、JAR デプロイメントとしてではなくコアモジュールとしてインストールしないとオブジェクトストアが適切に動作しないことに注意してください。
  2. データソースの jta 属性を false に設定します。

    /subsystem=datasources/data-source=TransDS:write-attribute(name=jta, value=false)
  3. jdbc-store-datasource 属性を、使用するデータソースの JNDI 名に設定します (例: java:jboss/datasources/TransDS)。

    /subsystem=transactions:write-attribute(name=jdbc-store-datasource, value=java:jboss/datasources/TransDS)
  4. use-jdbc-store 属性を true に設定します。

    /subsystem=transactions:write-attribute(name=use-jdbc-store, value=true)
  5. JBoss EAP サーバーを再起動し、変更を反映します。
トランザクション JDBC ストア属性

以下の表は、JDBC オブジェクトストレージに関係する利用可能な属性をすべて表しています。

注記

この表は、管理モデルで使用される属性名を示しています (管理 CLI を使用している場合など)。XML で使用される名前は管理モデルの名前と異なる場合があるため、XML で使用される要素を EAP_HOME/docs/schema/wildfly-txn_4_0.xsd のスキーマ定義ファイルで確認してください。

表13.3 トランザクション JDBC ストア属性

プロパティー説明

use-jdbc-store

トランザクションに対して JDBC ストアを有効にするには、true に設定します。

jdbc-store-datasource

ストレージに使用される JDBC データソースの JNDI 名。

jdbc-action-store-drop-table

起動時にアクションストアテーブルをドロップおよび再作成するかどうか。デフォルトは false です。

jdbc-action-store-table-prefix

アクションストアテーブル名の接頭辞。

jdbc-communication-store-drop-table

起動時にコミュニケーションストアテーブルをドロップおよび再作成するかどうか。デフォルトは false です。

jdbc-communication-store-table-prefix

コミュニケーションストアテーブル名の接頭辞。

jdbc-state-store-drop-table

起動時にステートストアテーブルをドロップおよび再作成するかどうか。デフォルトは false です。

jdbc-state-store-table-prefix

ステートストアテーブル名の接頭辞。

ActiveMQ ジャーナルオブジェクトストアの使用

以下の手順に従って、ActiveMQ ジャーナルオブジェクトストアを使用します。

  1. use-journal-store 属性を true に設定します。

    /subsystem=transactions:write-attribute(name=use-journal-store,value=true)
  2. JBoss EAP サーバーを再起動し、変更を反映します。