![]() |
![]() |
|
|
| |
この章では、トランザクション失敗の原因を突き止めたり、問題修正の手段を決定したりするためのトラブルシューティング ツールおよびタスクについて説明します。
WebLogic Server では、実行中のトランザクションをモニタし、ヒューリスティックな終了のケースで適切な情報を確実に取り込むことができます。また、データベース クエリ、トランザクション要求、および Bean メソッドのパフォーマンスをモニタすることもできます。
WebLogic Server では、トランザクションのトラブルシューティングで以下の支援を利用できます。
WebLogic JTA では、すべての標準の JTA 例外がサポートされています。標準の JTA 例外の詳細については、javax.transaction および javax.transaction.xa パッケージ API の Javadoc を参照してください。
標準の JTA 例外に加えて、WebLogic Server では weblogic.transaction.RollbackException
クラスが提供されます。このクラスは javax.transaction.RollbackException
を拡張し、ロールバックの元々の理由を保持します。トランザクションをロールバックする前、つまり rollbackonly
に設定する前に、アプリケーションではそのロールバックの理由を提供できます。トランザクション サービスの中で発生したすべてのロールバックではその理由が設定されます。たとえば、タイムアウト、XA エラー、beforeCompletion
での非検査例外、あるいはトランザクション マネージャへのアクセス不能などです。一度設定された理由は上書きできません。
トランザクション サービスでは、各トランザクションにトランザクション識別子(Xid
)が割り当てられます。この ID は、ログ ファイル内で特定トランザクションの情報を他と区別するために使用できます。トランザクション識別子は、weblogic.transaction.Transaction
インタフェースの getXID
メソッドを使用して取り出すことができます。トランザクション識別子を取得するメソッドの詳細については、weblogic.transaction.Transaction
の Javadoc を参照してください。
WebLogic JTA では、トランザクションの命名とユーザ定義プロパティをサポートする javax.transaction.Transaction
の拡張機能が提供されます。それらの拡張機能は、weblogic.transaction.Transaction
インタフェースに含まれています。
トランザクション名は、トランザクションの種類(送金やチケット購入など)を示します。したがって、サーバ上のユニークなトランザクションを識別するトランザクション ID とは混同しないでください。トランザクション名を利用すると、例外やログ ファイルでトランザクションの種類を簡単に識別できます。
ユーザ定義のプロパティはキーと値の組み合わせです。この場合のキーはプロパティを識別する文字列であり、値はプロパティに割り当てられた現在の値です。トランザクション プロパティの値は、Serializable
インタフェースを実装するオブジェクトでなければなりません。アプリケーションでは、weblogic.transaction.Transaction
インタフェースで定義されている set メソッドと get メソッドを使用してプロパティを管理します。一度設定されたプロパティは、有効期間が終わるまでトランザクションと共に存在し、トランザクションがシステムを移動するときにはマシン間で受け渡しされます。プロパティはトランザクション ログに保存され、クラッシュの回復処理で復元されます。トランザクション プロパティが複数回にわたって設定された場合は、最新の値が維持されます。
トランザクション名とトランザクション プロパティを設定および取得するメソッドの詳細については、weblogic.transaction.Transaction
の Javadoc を参照してください。
Java Transaction API では、javax.transaction.Status
クラスを使用してトランザクションのステータス コードが提供されます。weblogic.transaction.Transaction
の getStatusAsString
メソッドを使用すると、トランザクションのステータスを文字列として返すことができます。文字列には、javax.transaction.Status
で指定されているメジャー ステートと、補足的なマイナー ステート(logging
や pre-preparing
など)が含まれます。
トランザクションの統計は、サーバ上のトランザクション マネージャで処理されるすべてのトランザクションについて提供されます。それらの統計には、トランザクションの総数、特定の結果(コミット、ロールバック、ヒューリスティックな終了など)を持つトランザクションの数、ロールバックされたトランザクションの理由別の数、およびトランザクションがアクティブな状態を維持した合計時間が含まれます。トランザクションの統計の詳細については、Administration Console のオンライン ヘルプを参照してください。
進行中のトランザクションは、WebLogic Console を使用してモニタできます。 トランザクションの統計で説明されている統計に加えて、以下の情報を表示できます。
各サーバには、システムでのトランザクションの伝播に関する情報を記録するトランザクション ログがあります。トランザクション ログは、永続ストレージに書き込まれ、システムのクラッシュやネットワークの障害からサーバが復旧するのを支援します。トランザクション ログには、直接にはアクセスできません。トランザクション ログのファイルはバイナリ フォーマットです。
トランザクション ログは、複数のファイルで構成されます。各ファイルはガベージ コレクションの影響を受けます。したがって、トランザクション ログ ファイルに必要な記録がない場合は、システムによってファイルが削除され、そのディスク スペースがファイル システムに返されます。また、トランザクション ログ ファイルのサイズが大きくなりすぎた場合は、システムによって新しいログ ファイルが作成されます。
トランザクション ログ ファイルには、パス名プレフィックス、サーバ名、4 桁の数値サフィックス、およびファイル拡張子で構成されたユニークな名前が付けられます。WebLogic Console を使用して TransactionLogFilePrefix
サーバ属性の値を指定すれば、パス名プレフィックスを設定できます。トランザクション ログ ファイルを RAID デバイスなどの可用性の高いファイル システムで作成する場合は、必ず TransactionLogFilePrefix
属性を設定します。
websvr
というサーバ名の UNIX システムでは、以下のような名前でログ ファイルが作成されます。
/usr7/applog1/
websvr
0000.tlog
/usr7/applog1/websvr
0001.tlog
/usr7/applog1/websvr
0002.tlog
同様に、Windows NT システムでは以下のような名前でログ ファイルが作成されます。
C:\weblogic\logA\
websvr
0000.tlog
C:\weblogic\logA\websvr
0001.tlog
C:\weblogic\logA\websvr
0002.tlog
システムで大量のトランザクション ログ ファイルが作成されている場合は、完了していない長時間のトランザクションが 1 つまたは複数存在している可能性があります。その原因としては、リソース マネージャの障害や、トランザクションのタイムアウト値が著しく大きいことが考えられます。
トランザクション ログを格納するファイル システムでスペースが不足すると、commit
() によって SystemException
が送出され、トランザクション マネージャによってメッセージがシステム エラー ログに配置されます。利用可能なスペースが増えるまで、トランザクションはコミットされません。
サーバを別のマシンに移動するときには、すべてのトランザクション ログ ファイルも一緒にまとめて移動してください。
外部のトランザクション マネージャから WebLogic Server にトランザクションをインポートすると、WebLogic Server のトランザクション マネージャは、外部のトランザクション マネージャによって調整される XA リソースとして機能します。トランザクション破棄タイムアウトが経過した後や、WebLogic Server によってインポートされたトランザクションに参加する XA リソースがヒューリスティックな例外を送出する場合のような、まれに発生する致命的状況では、WebLogic Server のトランザクション マネージャはヒューリスティックな決定を行います。つまり、WebLogic Server のトランザクション マネージャは、外部のトランザクション マネージャからの入力を利用しないで、トランザクションをコミットまたはロールバックすることを決定します。ヒューリスティックな決定を行った WebLogic Server のトランザクション マネージャは、外部のトランザクション マネージャからトランザクションの無視を指示する通知を受け取るまで、ヒューリスティックな決定についての情報をヒューリスティック ログ ファイルに格納します。
ヒューリスティック ログ ファイルは、トランザクション ログ ファイルと共に格納され、.tlog
拡張子の前に .heur
の付いたトランザクション ログ ファイルと同様の名前が与えられます。ヒューリスティック ログ ファイルのフォーマットは次のとおりです。
<TLOG_file_prefix>/<server_name><4-digit number>.heur.tlog
websvr
というサーバ名の UNIX システムでは、次のようなヒューリスティック ログ ファイルが作成されます。
/usr7/applog1/
websvr
0000.heur.tlog
/usr7/applog1/websvr
0001.heur.tlog
/usr7/applog1/websvr
0002.heur.tlog
同様に、Windows システムでは、次のようなヒューリスティック ログ ファイルが作成されます。
C:/weblogic/logA/
websvr
0000.heur.tlog
C:/weblogic/logA/websvr
0001.heur.tlog
C:/weblogic/logA/websvr
0002.heur.tlog
トランザクションの命名プロパティを使用すると、問題のあるトランザクションを分離および識別できます。
トランザクションをデバッグするときには、WebLogic JTA と関与しているリソースの間で障害を分離する必要があります。
ヒューリスティックな終了(ヒューリスティックな決定)は、更新をコミットするかロールバックする分散トランザクションの終了段階でリソースが一方だけの決定を行ったときに発生します。これにより、分散されたデータは不確定な状態のままになります。ヒューリスティックな終了の原因としては、ネットワークの障害またはトランザクションのタイムアウトが考えられます。ヒューリスティックな終了が発生すると、以下のヒューリスティックな結果例外のいずれかが送出されます。
HeuristicRollback
− トランザクションに参加する 1 つのリソースが、準備してコミットの決定を待つことに同意しているにもかかわらず、処理のロールバックを自発的に決定した場合。トランザクション マネージャがトランザクションのコミットを決定すると、そのリソースによるヒューリスティックなロールバックの決定は不正になり、トランザクションの他のブランチはコミットされるため、矛盾した結果を招きます。
HeuristicCommit
− トランザクションに参加する 1 つのリソースが、準備してコミットの決定を待つことに同意しているにもかかわらず、処理のコミットを自発的に決定した場合。トランザクション マネージャがトランザクションのロールバックを決定すると、そのリソースによるヒューリスティックなコミットの決定は不正になり、トランザクションの他のブランチはロールバックされるため、矛盾した結果を招きます。
HeuristicMixed
− トランザクションが、参加リソースの一部がコミットし、一部がロールバックするという混合した結果になったことを、トランザクション マネージャで認識している場合。主に、1 つまたは複数の参加リソースが、ヒューリスティックなロールバックまたはヒューリスティックなコミットを決定したことが原因で発生します。
HeuristicHazard
― トランザクションが、参加リソースの一部がコミットし、一部がロールバックするという混合した結果になったことを、トランザクション マネージャで認識している場合。ただし、システムまたはリソースに障害があるため、HeuristicMixed の結果が確かに発生したかどうかを確認できない場合。主に、1 つまたは複数の参加リソースが、ヒューリスティックなロールバックまたはヒューリスティックなコミットを決定したことが原因で発生します。
ヒューリスティックな終了が発生すると、サーバ ログにメッセージが書き込まれます。ヒューリスティックな終了を解決する方法については、データベース ベンダが提供するドキュメントを参照してください。
一部のリソース マネージャでは、ヒューリスティックな終了のコンテキスト情報が保存されます。この情報は、リソース マネージャのデータの矛盾を解決するときに便利です。WebLogic Console の JTA パネルで ForgetHeuristics
属性が true に設定されている場合、この情報はヒューリスティックな終了の後で削除されます。コンテキスト情報を保存するリソース マネージャを使用するときには、ForgetHeuristics
属性を false に設定することをお勧めします。
WebLogic Server のトランザクション マネージャは、ユーザによる最低限の介入でシステムのクラッシュから回復するように設計されています。準備されたトランザクションは、たとえ複数のクラッシュの後であっても、トランザクション マネージャからコミットまたはロールバックが行われることなくリソース マネージャで未解決のまま残ることはありません。
指定した時間が過ぎた後にトランザクションを破棄することもできます。AbandonTimeoutSeconds
属性を使用すると、トランザクション コーディネータがトランザクションの完了を試みる最大限の時間を秒単位で設定できます。デフォルト値は 86,400 秒、つまり 24 時間です。この時間を過ぎると、利用できないリソースや、トランザクションの結果を承認できないリソースが関わるトランザクションでそれ以上の解決は試行されません。
システムがクラッシュした後、トランザクション マネージャには以下の責任があります。
トランザクションがクラッシュの前にコミットされ、XAResource.recover()
によってトランザクション ID が返される場合、トランザクション マネージャでは一貫して XAResource.commit()
が呼び出されます。トランザクションがクラッシュの前にコミットされず、XAResource.recover()
によってトランザクション ID が返される場合、トランザクション マネージャでは一貫して XAResource.rollback()
が呼び出されます。つまり、トランザクション マネージャのクラッシュだけで、一部のブランチがコミットされ一部がロールバックされる混合ヒューリスティックの終了が生じることはありません。
リソース マネージャとのトランザクションが準備されている場合、トランザクション マネージャではそのリソース マネージャの回復処理時に XAResource.recover()
を呼び出し、最終的には、commit()
、rollback()
、または forget()
を呼び出すことによって、recover()
で返されたすべてのトランザクション ID を解決しなければなりません。
リソース マネージャがクラッシュした場合でも、トランザクション マネージャでは準備されている各トランザクションについて commit()
または rollback()
を呼び出さなければなりません。commit()
または rollback()
の呼び出しは成功するまで続けられます。トランザクション解決の試行は、AbandonTimeoutSeconds
コンフィグレーション属性を設定することで制限できます。
リソース マネージャによってヒューリスティックなコミットまたはヒューリスティックなロールバックが報告された場合、それはトランザクション マネージャによってサーバ ログに記録され、Forget Heuristics
コンフィグレーション属性が有効な場合は forget()
が呼び出されます。Forget Heuristics
コンフィグレーション属性が有効ではない場合のヒューリスティックな終了の解決については、データベース ベンダが提供するドキュメントを参照してください。
![]() |
![]() |
![]() |