プライマリ・コンテンツに移動
Oracle® Real Application Clusters管理およびデプロイメント・ガイド
12cリリース1 (12.1)
B71323-07
目次へ移動
目次
索引へ移動
索引

前
次

トランザクション・ガードの概要

停止後にアプリケーションをリカバリする際の根本的問題の1つが、クライアントに返送されたコミット・メッセージに継続性がないことです。クライアントとサーバー間に通信の遮断がある場合、クライアントは通信の失敗(リカバリ可能エラーとも呼ばれる)を示すエラー・メッセージを受信します。このエラーでは、送信によってコミット操作が実行されたかどうか、もしくは、プロシージャ・コールが予定されたすべてのコミットおよびセッション状態変更を行って完了まで実行されたか、一部の動作は失敗したか、またはクライアントから切断したまま現在も実行中というさらに悪い状態になっているかということがアプリケーションには知らされません。

トランザクション・ガードは、計画済停止と計画外停止および送信の繰返しの場合に、実行を1回以下にするためにアプリケーションで使用される汎用プロトコルおよびAPIを提供します。アプリケーションでは論理トランザクションID (LTXID)という新しい概念を使用して、停止に続くデータベース・セッション内でオープンになっている最終トランザクションの結果が判断されます。トランザクション・ガードを使用しないと、アプリケーションが停止の後に操作を実行しようとして、トランザクションが重複してコミットされ論理破損が発生する可能性があります。アプリケーション・コンティニュイティはこの機能を使用し、他のアプリケーションは、失敗したセッションの最後の結果を特定するためにこの機能を使用できます。

トランザクション・ガードを使用しないと、トランザクションが開始され、コミットが発行された場合、クライアントに返されるコミット・メッセージに継続性がありません。トランザクションがコミットされたかどうかはクライアントにはわかりません。トランザクションは、非トランザクション状態が不正確な場合、またはそのトランザクションがコミットされている場合は、有効に再送信できません。保障されたコミットや完了情報がないと、再送信により、トランザクションが複数回適用されることになる可能性があります。コミットされているが完了していないトランザクションの処理を続けると、誤った状態にあるデータベース・セッションがアプリケーションで使用される結果になります。

Oracle Database 12cでは、トランザクション・ガードによって、自動的かつ透過的に基準化された方法で冪等性を達成するために、アプリケーションで使用される新たな完全統合ツールが提供されます。トランザクション・ガードでは、論理トランザクションID (LTXID)を使用して、重複したトランザクションの送信を回避します。これは、トランザクションの冪等性と呼ばれます。LTXIDはコミット時に継続され、ロールバックの後に再使用されます。通常の実行中、LTXIDは、各データベース・トランザクションについてクライアントおよびサーバーの両方で自動的にセッションで保持されます。コミット時に、LTXIDはトランザクションのコミットの一環として継続され、次に使用するLTXIDがクライアントに返されます。

次の例では、Application Continuityまたはサード・パーティ製アプリケーションがトランザクション・ガードを使用する方法を示します。

  1. クライアントがFAN停止イベントまたはリカバリ可能エラーを受け取ります。

  2. FANを使用している場合、FANドライバは自動的に停止セッションを中断します。

  3. リカバリ可能エラーである場合、Application Continuityはトランザクション・ガードを使用して、停止セッションの結果を判別します。

    1. クライアント・ドライバが提供するAPI (JDBCの場合はgetLTXID、Oracle Call Interfaceの場合はLTXIDを指定したOCI_ATTR_GET、ODP.NETの場合はLogicalTransactionId)を使用して、停止セッションから最終LTXIDを取得します。

    2. 新しいセッションを取得します。

    3. PL/SQLプロシージャGET_LTXID_OUTCOMEを、失敗したセッションから取得した最終LTXIDとともに呼び出します。

    4. このトランザクションの結果がCOMMITTEDおよびCOMPLETEDの場合は、そのトランザクションの結果をアプリケーションに返します。

    5. このトランザクションの結果がCOMMITTEDおよびNOT USER_CALL_COMPLETEDの場合は、COMMITTED、およびユーザー・コールが完了していないことを示す警告を返します。

    6. トランザクションの結果がCOMMITTEDではない場合は、必要に応じて、最終要求から残されたあらゆる状態をクリーンアップしてから、最終要求を再送信します。

関連項目:

トランザクション・ガードの詳細は、『Oracle Database開発ガイド』を参照してください。