X

An Oracle blog about WebLogic Channel

「WebLogic Server Transaction Basics」レポート

WebLogic勉強会 通信

WebLogic Serverファンの皆様、こんにちは、WebLogic Server勉強会通信です。
2014年2月26日に東京で開催された
「第44回WebLogic Server勉強会@東京」
「WebLogic Server Transaction Basics」(講師:日本オラクル オラクルユニバーシティ 岡田 大輔)をレポートします。このセッションでは、岡田さんが分散トランザクションの基本概念からWebLogic Serverでのトランザクション設定やモニタ方法、トランザクション回復サービスなどの障害発生時の対応のポイントを解説しました。トランザクションサービスやTLOGの役割、タイムアウトやTLOGの設定方法、リカバリ手順など現場で役立つ情報満載です。(日本オラクル Fusion Middleware事業統括本部 佐々木 政和)

トランザクションとは

日本オラクル オラクルユニバーシティの岡田さんが分散トランザクションの基本概念から
WebLogic Serverでのトランザクション設定やモニタ方法、
トランザクション回復サービスなどの障害発生時の対応のポイントを解説しました。

トランザクションは、大まかに言うと一連の処理をまとめて一つの処理として取り扱うことであり、
厳密には、ACID特性をすべて満たさなければなりません。つまり、
①Atomicity(原子性) – 処理は成功か失敗のいずれか、
②Consistency(一貫性) – 処理前後ではデータの一貫性が保たれる、
③Isolation(独立性) – 同時に実行される複数の処理は互いに干渉しない、
④Durability(永続性) – 確定したトランザクションの結果は確実に永続化される
ことです。
実際の業務の流れをITシステム化する場合にトランザクションの
考え方を使用するとシンプルでかつ信頼性の高いアプリケーション開発が可能です。
WebLogic Serverでは、フラット・トランザクション・モデルが実装されています。
ネスト・トランザクションはサポートされていません。

X/Open DTPモデル(現The Open Group DTPモデル)

X/Open DTPモデル(The Open Group DTPモデル)は、アプリケーション(AP)と
トランザクションマネージャ(TM)、リソースマネージャ(RM)の関係を示しています。
トランザクションマネージャ(TM)は、アプリケーションに代わってグローバルトランザクションの管理を
行うサーバソフトウェアコンポーネントで、アプリケーションからのグローバルトランザクションの開始/終了要求
に基づいて、そのトランザクションに関与する全てのリソースマネージャと2フェーズコミット(2PC)に基づいた通信を
行いトランザクションを制御します。
リソースマネージャ(RM)は、データやプロセスへのアクセスを提供するインタフェースおよび関連ソフトウェアであり、
トランザクション処理機能と永続化機構を持ちます。
DTPモデルでは、アプリケーションからトランザクションを制御する場合は
JTA (Java Transaction API)を使用すること、データベース上のデータへのアクセスはSQLを使用、
TMとRM間はXAインタフェースで制御されることが規定されています。
WebLogic Serverのアプリケーションは、WebクライアントからのメッセージをJavaのオブジェクト間で連携しながら
必要に応じてデータベースやメッセージキューにアクセスするのが典型パターンです。
DTPモデルに沿ったアプリケーションはJTAを使用してトランザクションの開始、コミット、
ロールバックの制御をおこなうこと以外、トランザクションに関する細かな制御ロジックは必要ないので
アプリケーション開発者はビジネスロジックの実装に専念することができます。

2フェーズコミット(2 Phase Commit)

TMがJMSやXA DataSourceなどトランザクションに関与する複数のRMを調整して、トランザクションの制御を行うトランザクションを
グローバルトランザクション(分散トランザクション)と言い、トランザクション制御はトランザクションマネージャにより行われます。
例えば、①単一トランザクションでDB, JMSにアクセスする場合、②単一トランザクションで2つ以上のDBにアクセスする場合、
③トランザクションがEJBコンテナによって開始された場合(EJBコンテナはサーバ上のTMを利用)などです。これらの
トランザクションは、アプリケーションがcommitを発行した後でTMとRM間で2 Phase Commitプロトコルが行われます。

2PCプロトコルは複数のRMをまたぐ
単一トランザクションを調整する
方法です。
PrepareフェーズとCommitフェーズと呼ばれる2つのフェーズを用いてトランザクションをコミットします。
Prepareフェーズ(フェーズ1)は、グローバルトランザクションに参加しているリソースが
トランザクションブランチ
を処理する準備を行うフェーズです。すべてのRMから準備OKの応答があれば、
TLOGに書き込み、フェーズ2に進みます。
Commitフェーズ(フェーズ2)は、グローバルトランザクションに
参加
しているリソースが
実際にトランザクションブランチを処理するフェーズです。すべてのRMから処理OKの応答があれば、
アプリケーションにCommitが成功したという応答を返します。

WebLogic Serverでのトランザクション処理を解説

トランザクションを開始するアプリケションは初めにJNDIを使用して
UserTransactionオブジェクトの参照(ut)を取得します。
それから、トランザクション境界をut.begin()とut.commit()で囲みます。
そのトランザクションを識別するためにXIDが割り当てられます。
トランザクション境界内で例外が発生した場合は、そのトランザクションを明示的にロールバック
(ut.rollback())するようにプログラミングします。
この例では、トランザクション境界の中に挿入されたメソッドは、コンテナ管理のトランザクションであるEJB(CMT)を呼び出しています。
EJBコンテナは@TransactionAttributeを使用してトランザクション属性を制御します。
ejb1.callA()はREQUIRED, ejb2.callB()はSUPPORTSが指定されています。このオプションではクライアント側で
開始したトランザクションが引き継がれますので、それぞれのEJB内のejb1.callA(),ejb2.callB()メソッドから
RMにアクセスされる処理はトランザクションに含まれます。アプリケーションのut.commit()呼び出し時に
トランザクションマネージャ(WebLogic Server)はデータベース1とデータベース2に対して
2 Phase Commitを用いてコミット処理を行います。

Logging Last Resource (LLR)

グローバルトランザクションに参加できるRMはXAインタフェースを実装していることが条件になりますが、
WebLogic ServerはXAインタフェースに準拠していないRMも一つに限り参加できる仕組みを提供しています。
この機能をロギング・ラスト・リソース(LLR)最適化と言います。
このLLR最適化機能は、1つの非XAリソースが、XAと同様なレベルのACID保証を伴ってグローバル・トランザクションに
参加できるようにするオプションです。
このLLRの仕組みは、WebLogic Serverトランザクション・マネージャが、トランザクションの他のすべてのリソースを準備し、
その後、LLRリソースのローカル・トランザクションの結果に基づいて、グローバル・トランザクションに対するコミットの決定を
行うことです。

WebLogic Serverトランザクション・マネージャは次の基本的な手順に従います。
① アプリケーションがcommitを呼び出す。
② 他のすべての(XA対応の)トランザクション参加リソースに対してprepareを呼び出す。
③ LLR参加リソースの表へコミット・レコードを挿入する。
④ LLR参加リソースのローカル・トランザクション(トランザクション・コミット・レコードの挿入とアプリケーションのSQL処理の双方を含む)をコミットします。
⑤ その他すべてのトランザクション参加リソースに対してcommitを呼び出します。

WebLogic Serverのトランザクション運用管理のポイント

1. トランザクションサービスはWebLogic Server起動時に開始
されます。



トランザクションサービスのパラメータはドメイン単位(12.1.1はクラスタ単位でも可能、クラスタのJTA設定はドメインのJTA設定よりも優先される)で有効になります。(トランザクションタイムアウト、完了タイムアウトなど)

2. トランザクションタイムアウト(デフォルト 30秒)

トランザクション開始からフェーズ1完了までの持続時間。この時間を超えるとトランザクションはタイムアウトし、ロールバックされます。

3.完了タイムアウト: フェーズ2のタイムアウト

[10.3.3.0~]トランザクションのフェーズ2のタイムアウト時間。デフォルト(0)はtransaction-timeout x 2(秒)

4. トランザクションログ

未完了のトランザクション情報を格納するログ。
トランザクションログはバイナリ形式のため、直接見ることはできません。
トランザクションログはサーバのデフォルト永続ストアに格納されます。
(デフォルト永続ストア: $DOMAIN/servers//data/store/default/_WLS_ 000000.DAT)
WebLogic Server 12cではJDBCストアを使用可能(この場合アプリケーションデータ, JMS, TLOGをDBに一括格納可能)

5. トランザクションのモニタはサーバ・レベルで行います。

①トランザクション統計(JTARuntimeMBean/JTATransactionStatisticsRuntimeMBean)、
②トランザクションログストア統計(TransacitonLogStoreRuntimeMBean)、
③XA (TransactionResourceRuntimeMBean)、
④非XAリソース (NonXAResourceRuntimeMBean)、
⑤回復サービス(RecoveryRuntimeMBean)、
⑥現在のトランザクション (JTARuntimeMBeanのJTATransactions属性)
など。

6. 障害回復

トランザクションがらみの障害発生時はデータの不整合が生じる可能性があるので注意が必要です。
WebLogic Serverはトランザクションリカバリサービス
(TLOGを解析して未完了のトランザクションの解決を行い、2PC処理を完了させる)を提供しており、
サーバ起動時に自動的に実行されます。
その際にTLOGとRM状態の相違、RMからエラーが返ってきた場合などはログに記録されます。管理者はログ
の内容やアプリケーション側のトランザクションの状況を分析して、必要に応じて手動で解決しなければなりません。
不幸にして一部コミット、一部ロールバックの不整合が発生した場合はどちらかを戻すような処理(通常はCompensation
Transaction 補正処理)が必要になります。

まとめ

岡田さんの「WebLogic Server Transaction Basics」セッションについてまとめて見ました。
WebLogic Serverのトランザクションマネージャに相当する機能は、トランザクションサービス(トランザクション
リカバリーサービス含む)としてWebLogic Server起動時に開始されます。トランザクションタイムアウトなどのパラメータは
ドメイン単位(クラスタも可能)で設定できますので、アプリケーション環境に適切な値を設定してください。
それから、グローバルトランザクションではTLOGが重要になります。WebLogic Server 12cからJDBC上に配置できるように
なりましたので、サーバ障害時のフェイルオーバーの手順中のTLOG複製はJDBCの切り替えなどの対応も検討できるでしょう。
次回は、LTセッションをレポートしたいと思います。




Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.