Red Hat Training
A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform
第13章 トランザクションの設定
13.1. Transactions サブシステムの設定
13.1.1. トランザクションマネージャーの設定
トランザクションマネージャーは、Web ベースの管理コンソールまたはコマンドライン管理 CLI を使用して設定できます。
管理コンソールを使用したトランザクションマネージャーの設定
以下の手順は、Web ベースの管理コンソールを使用してトランザクションマネージャーを設定する方法を示しています。
- 画面上部の Configuration タブを選択します。
- JBoss EAP を管理対象ドメインとして実行している場合は、変更する任意のプロファイルを選択します。
- Subsystem リストから、Transactions を選択し、View をクリックします。
- 編集する設定に応じたタブ (リカバリーオプションの場合の Recovery など) で Edit をクリックします。
- 必要な変更を行い、Save をクリックして変更を保存します。
- ヘルプ をクリックしてヘルプテキストを表示します。
管理 CLI を使用したトランザクションマネージャーの設定
管理 CLI で一連のコマンドを使用してトランザクションマネージャーを設定できます。これらのコマンドはすべて /subsystem=transactions
(スタンドアロンサーバー向け) または /profile=default/subsystem=transactions/
(管理対象ドメインの default
プロファイル向け) で始まります。
トランザクションマネージャーのすべての設定オプションの詳細なリストについては、「トランザクションマネージャーの設定オプション」を参照してください。
13.1.2. システムプロパティーを使用したトラザクションマネージャーの設定
トランザクションマネージャーのオプションは管理コンソールまたは管理 CLI を使用して設定できますが、多くのトランザクションマネージャーのオプションはシステムプロパティーを使用して設定することも可能です。
以下は、システムプロパティーを使用してのみ設定できるオプションです。管理 CLI や管理コンソールを使用して設定できません。
プロパティー名 | 説明 |
---|---|
RecoveryEnvironmentBean.periodicRecoveryPeriod |
リカバリーを試行する間隔 (秒単位)。
|
RecoveryEnvironmentBean.recoveryBackoffPeriod |
最初と 2 度目のリカバリーパスの間隔 (秒単位)。
|
RecoveryEnvironmentBean.periodicRecoveryInitializationOffset |
最初のリカバリーパスより前の間隔 (秒単位)。
|
RecoveryEnvironmentBean.expiryScanInterval |
期限切れスキャンの間隔 (時間単位)。
|
以下は、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 を使用するようデータソースを設定
以下の管理 CLI コマンドを使用して
jta
属性をtrue
に設定します。/subsystem=datasources/data-source=DATASOURCE_NAME:write-attribute(name=jta,value=true)
注記管理対象ドメインでは、このコマンドの前に
/profile=PROFILE_NAME
を付けます。変更を反映するためにサーバーをリロードします。
reload
データソースが JTA を使用するように設定されます。
13.1.4. トランザクションログメッセージ
トランザクションロガーに DEBUG
ログレベルを使用することにより、ログファイルを読み取り可能な状態に保ちつつトランザクションを追跡できます。詳細なデバッグの場合は、TRACE
ログレベルを使用します。トランザクションロガーの設定に関する詳細については、「Transactions サブシステムのロギング設定」を参照してください。
TRACE
ログレベルでログを記録するよう設定すると、トランザクションマネージャー (TM) は多くのロギング情報を生成できます。最も一般的なメッセージの一部は次のとおりです。このリストは包括的ではなく、他のメッセージが表示されることもあります。
表13.1 トランザクション状態の変更
トランザクションの開始 |
トランザクションが開始されたら、クラス |
トランザクションのコミット |
トランザクションがコミットされたら、クラス |
トランザクションのロールバック |
トランザクションがロールバックされたら、クラス |
トランザクションのタイムアウト |
トランザクションがタイムアウトすると、 |
13.1.5. Transactions サブシステムのロギング設定
JBoss EAP の他のログ設定に依存せずにログに記録されたトランザクションに関する情報の量を制御できます。ログ設定は、管理コンソールまたは管理 CLI を使用して設定できます。
管理コンソールを使用したトランザクションロガーの設定
Logging サブシステム設定に移動します。
- 管理コンソールで、Configuration タブをクリックします。管理対象ドメインを使用する場合は、最初に適切なサーバープロファイルを選択する必要があります。
- Logging サブシステムを選択し、View をクリックします。
com.arjuna
属性を編集します。Log Categories タブを選択します。
com.arjuna
エントリーがすでに存在します。com.arjuna
を選択し、属性セクションの Edit をクリックします。ログレベルを変更し、親ハンドラーを使用するかどうかを選択できます。ログレベル:
トランザクションにより大量のロギング出力が生成されることがあるため、サーバーのログがトランザクション出力で満たされないようデフォルトのロギングレベルは
WARN
に設定されます。トランザクション処理の詳細を確認する必要がある場合は、トランザクション ID が表示されるようTRACE
ログレベルを使用します。親ハンドラーの使用:
親ハンドラーはロガーが出力を親ロガーに送信するかどうかを指定します。デフォルトの動作は
true
です。
- 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-logs
を true
に設定する必要があります。このオプションは管理モデルには保存されず、サーバーが再起動されると 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-store
で probe
操作を実行し、参加者がリストされていないことを確認します。最後の参加者が削除されると、トランザクションも削除されます。
トランザクション参加者の状態の更新
トランザクションをリカバリーする必要がある場合は、リカバリーを試行する前に 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 データソースをトランザクションオブジェクトストアとして使用するには、以下の手順に従います。
-
データソース (例:
TransDS
) を作成します。手順は「非 XA データソースの作成」を参照してください。データソースの JDBC ドライバーは、JAR デプロイメントとしてではなくコアモジュールとしてインストールしないとオブジェクトストアが適切に動作しないことに注意してください。 データソースの
jta
属性をfalse
に設定します。/subsystem=datasources/data-source=TransDS:write-attribute(name=jta, value=false)
jdbc-store-datasource
属性を、使用するデータソースの JNDI 名に設定します (例:java:jboss/datasources/TransDS
)。/subsystem=transactions:write-attribute(name=jdbc-store-datasource, value=java:jboss/datasources/TransDS)
use-jdbc-store
属性をtrue
に設定します。/subsystem=transactions:write-attribute(name=use-jdbc-store, value=true)
- JBoss EAP サーバーを再起動し、変更を反映します。
トランザクション JDBC ストア属性
以下の表は、JDBC オブジェクトストレージに関係する利用可能な属性をすべて表しています。
この表は、管理モデルで使用される属性名を示しています (管理 CLI を使用している場合など)。XML で使用される名前は管理モデルの名前と異なる場合があるため、XML で使用される要素を EAP_HOME/docs/schema/wildfly-txn_4_0.xsd
のスキーマ定義ファイルで確認してください。
表13.3 トランザクション JDBC ストア属性
プロパティー | 説明 |
---|---|
use-jdbc-store |
トランザクションに対して JDBC ストアを有効にするには、 |
jdbc-store-datasource |
ストレージに使用される JDBC データソースの JNDI 名。 |
jdbc-action-store-drop-table |
起動時にアクションストアテーブルをドロップおよび再作成するかどうか。デフォルトは |
jdbc-action-store-table-prefix |
アクションストアテーブル名の接頭辞。 |
jdbc-communication-store-drop-table |
起動時にコミュニケーションストアテーブルをドロップおよび再作成するかどうか。デフォルトは |
jdbc-communication-store-table-prefix |
コミュニケーションストアテーブル名の接頭辞。 |
jdbc-state-store-drop-table |
起動時にステートストアテーブルをドロップおよび再作成するかどうか。デフォルトは |
jdbc-state-store-table-prefix |
ステートストアテーブル名の接頭辞。 |
ActiveMQ ジャーナルオブジェクトストアの使用
以下の手順に従って、ActiveMQ ジャーナルオブジェクトストアを使用します。
use-journal-store
属性をtrue
に設定します。/subsystem=transactions:write-attribute(name=use-journal-store,value=true)
- JBoss EAP サーバーを再起動し、変更を反映します。