21 DBMS_APP_CONT

DBMS_APP_CONTパッケージは、使用できなくなったセッションの実行中のトランザクションがコミットされたかどうか、およびそのセッションに対する最後のコールが完了したかどうかを判断できるインタフェースを提供します。

参照:

アプリケーション・コンティニュイティとトランザクション・ガードの説明およびこれら2つの機能の関連性については、『Oracle Database開発ガイド』を参照してください。

この章のトピックは、次のとおりです:

DBMS_APP_CONTの概要

DBMS_APP_CONTパッケージを使用して、この例の問題を解決できます。

問題の詳細

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

GET_LTXID_OUTCOME

GET_LTXID_OUTCOMEプロシージャの目的は、使用できなくなったセッションの実行中のトランザクションが完了したかどうかを判断することです。 元のセッションが使用できなくなったためにエラーが戻されるときに使用されます。 セッションが使用できなくなる理由として、セッション、インスタンス、サーバー、ネットワークの障害や、計画済停止または計画外停止があげられます。 このような停止が発生すると、アプリケーションは切断エラーを受信します。 しかし、このエラーでは、トランザクションがコミットされたかどうかを示す情報が提供されません。 また、アプリケーションの復旧後に、どんなコミット結果が期待されているかも示されていません。

参照:

論理トランザクションIDについては、『Oracle Database概要』を参照してください。

DBMS_APP_CONTのセキュリティ・モデル

アプリケーションでは、DBMS_APP_CONTパッケージのEXECUTE権限が必要です。

この権限を付与するには、データベース管理者が次のSQL文を実行する必要があります。

GRANT execute on DBMS_APP_CONT to application user ;

DBMS_APP_CONTサブプログラムの要約

このトピックでは、DBMS_APP_CONTサブプログラムをアルファベット順にリストし、簡単に説明します。

表21-1 DBMS_APP_CONTパッケージのサブプログラム

サブプログラム 説明

APPLY_REPLAY_RULEプロシージャ

このプロシージャは、どのサブルーチンにも継承される新しいリプレイ・ルールをアクティブ化します。ただし、そのサブルーチンに適用される新しいルールによって上書きされた場合を除きます。

GET_LTXID_OUTCOMEプロシージャ

セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。

GET_REPLAY_RULESファンクション

このファンクションは、リプレイ・ルールのリストを返します。 その結果から、ルール・ターゲットがビットおよびファンクションでリプレイ可能かどうかをテストできます。

RESET_REPLAY_RULESプロシージャ

このプロシージャは、既存のすべてのリプレイ・ルールをリセットします。 このプロシージャをコールすると、指定したスコープ内でローカルに定義されたルールがすべてクリアされ、親スコープ(親スコープが指定されていない場合はサービス)から継承していた元の状態にリストアされます。

APPLY_REPLAY_RULEプロシージャ

このプロシージャは、どのサブルーチンにも継承される新しいリプレイ・ルールをアクティブ化します。ただし、そのサブルーチンに適用される新しいルールによって上書きされた場合を除きます。

PL/SQLブロックでアクティブ化されたリプレイ・ルールは、reset_replay_rulesがコールされるか、ブロックが戻されたときに効果を失います。

ノート:

プロシージャ、ファンクションまたは無名ブロックのサブブロック内でこのプロシージャをコールすると、その親スコープにルールが適用されます。 サブブロックが復帰しても、ルールの効果が失われなくなります。 そのため、このプロシージャをサブブロック内でコールすることはお薦めしません。

構文

DBMS_APP_CONT.APPLY_REPLAY_RULE (
 replayable IN  BOOLEAN, 
 targets    IN  BINARY_INTEGER, 
 scope      IN  BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT);

パラメータ

表21-2 APPLY_REPLAY_RULEプロシージャのパラメータ

パラメータ 説明

replayable

TRUEまたはFALSE。ルールがリプレイ可能かどうかによって決まります。

targets

このルールが適用されるターゲットの効果。 複数の効果が必要な場合は、それらの効果をビットとして渡すか、個別の効果としてdbms_app_cont.side_effects + dbms_app_cont.autonomous_transactionsのようにして渡します

scope

ルールのスコープ。dbms_app_cont.scope_current (デフォルト)またはdbms_app_cont.scope_parent

GET_LTXID_OUTCOMEプロシージャ

このプロシージャは、セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。

構文

DBMS_APP_CONT.GET_LTXID_OUTCOME (
 client_ltxid          IN    RAW, 
 committed             OUT   BOOLEAN, 
 user_call_completed   OUT   BOOLEAN)

パラメータ

表21-3 GET_LTXID_OUTCOMEプロシージャのパラメータ

パラメータ 説明

client_ltxid

クライアント側の論理トランザクションID。 前回失敗したセッションからLTXIDを、クライアント・ドライバで提供されたAPI、すなわちJDBCの場合はgetLTXIDODP.netの場合はLogicalTransactionId、およびOCIの場合はLTXIDOCI_ATTR_GETを使用して取得します。

committed

指定した論理LTXIDのトランザクションがCOMMITTEDの場合、TRUEを戻します。 論理LTXIDCOMMITTEDでない場合、FALSEを戻します。 FALSEが戻されるときにLTXIDの使用がブロックされるため、前回実行していたトランザクションがこのLTXIDでコミットされることはありません。

user_call_completed

すべての情報がクライアントに戻されたかどうか。 このようなメッセージの例として、自動コミットまたはコミットを正常に使用できたときに処理された行数、PL/SQLコール時のパラメータとファンクションの結果、またはCOMMIT後の処理を記述するPL/SQLなどがあげられます。 正常に機能するためにコミットの戻り値のデータを必要とするアプリケーションでは、この2番目のパラメータを参照してください。

例外

表21-4 GET_LTXID_OUTCOMEプロシージャの例外

例外 説明

ORA-14950 - SERVER_AHEAD

サーバーの情報が最新であるため、トランザクションは古くてすでにコミットされたものです。 アプリケーションから渡されたLTXIDは古く、そのセッションで最後に使用したものではないため、これはエラーです。 GET_LTXID_OUTCOMEの目的は、リカバリ可能な停止後にそのセッションの現在のトランザクションの結果を戻すことです。

ORA-14951 - CLIENT_AHEAD

クライアントがサーバーより進んでいます。 これは、サーバーがフラッシュバックされた場合やメディア・リカバリを使用してリカバリされた場合、またはデータ損失を伴いながらも早期にオープンされたスタンバイである場合に発生することがあります。

ORA-14906 - SAME_SESSION

LTXIDの所有セッションでのGET_LTXID_OUTCOMEの実行はサポートされていません。リカバリ可能な停止後は、そのセッションにおける処理がブロックされるからです。

ORA-14909 - COMMIT_BLOCKED

同じユーザー名を持つ別のユーザーによってGET_LTXID_OUTCOMEを使用してセッションのコミットがブロックされています。 GET_LTXID_OUTCOMEは、非活動状態のセッションでのみコールしてください。 アプリケーション管理者に確認してください。

ORA-14952 - ERROR

結果を確認できません。 処理中にエラーが発生しました。 エラー・スタックにエラーの詳細が示されています。

GET_REPLAY_RULESファンクション

このファンクションは、リプレイ・ルールのリストを返します。 結果から、BITANDファンクションを使用してルール・ターゲットがリプレイ可能かどうかをテストできます。

構文

DBMS_APP_CONT.GET_REPLAY_RULES (
 replayable IN  BOOLEAN, 
 scope      IN  BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT)
 RETURN     BINARY_INTEGER;

パラメータ

表21-5 GET_REPLAY_RULESプロシージャのパラメータ

パラメータ 説明

replayable

TRUEまたはFALSE。ルールがリプレイ可能かどうかによって決まります。

scope

ルールのスコープ。dbms_app_cont.scope_current (デフォルト)またはdbms_app_cont.scope_parent

RESET_REPLAY_RULESプロシージャ

このプロシージャは、既存のすべてのリプレイ・ルールをリセットします。 このプロシージャをコールすると、指定したスコープ内でローカルに定義されたルールがすべてクリアされ、親スコープ(親スコープが指定されていない場合はサービス)から継承していた元の状態にリストアされます。

構文

DBMS_APP_CONT.RESET_REPLAY_RULES (
 targets  IN  BINARY_INTEGER DEFAULT NULL, 
 scope    IN  BINARY_INTEGER DEFAULT DBMS_APP_CONT.SCOPE_CURRENT);

パラメータ

表21-6 RESET_REPLAY_RULESプロシージャのパラメータ

パラメータ 説明

targets

ルールをリセットするターゲットの効果。

scope

ルールのスコープ。dbms_app_cont.scope_current (デフォルト)またはdbms_app_cont.scope_parent