18 DBMS_APP_CONT
DBMS_APP_CONT
パッケージは、使用できなくなったセッションの実行中のトランザクションがコミットされたかどうか、およびそのセッションに対する最後のコールが完了したかどうかを判断できるインタフェースを提供します。
参照:
アプリケーション・コンティニュイティとトランザクション・ガードの説明およびこれら2つの機能の関連性については、『Oracle Database開発ガイド』を参照してください。
この章のトピックは、次のとおりです:
18.1 DBMS_APP_CONTの概要
DBMS_APP_CONTパッケージを使用して、この例の問題を解決できます。
問題の詳細
停止後にアプリケーションをリカバリする際の根本的問題の1つは、クライアントに返送されたコミット・メッセージに継続性がないことです。クライアントとサーバー間に間隔がある場合、クライアントには通信の失敗というエラー・メッセージが示されます。このエラーでは次のことがアプリケーションに知らされません。すなわち、送信によってコミット操作が実行されたかどうか、もしくは、プロシージャ・コールが予定されたすべてのコミットおよびセッション状態変更を行って完了まで実行されたか、一部の動作は失敗したか、またはクライアントから切断したまま現在も実行中というさらに悪い状態になっているかということです。
GET_LTXID_OUTCOME
GET_LTXID_OUTCOMEプロシージャの目的は、使用できなくなったセッションの実行中のトランザクションが完了したかどうかを判断することです。元のセッションが使用できなくなったためにエラーが戻されるときに使用されます。セッションが使用できなくなる理由として、セッション、インスタンス、サーバー、ネットワークの障害や、計画済停止または計画外停止があげられます。このような停止が発生すると、アプリケーションは切断エラーを受信します。しかし、このエラーでは、トランザクションがコミットされたかどうかを示す情報が提供されません。また、アプリケーションの復旧後に、どんなコミット結果が期待されているかも示されていません。
参照:
論理トランザクションIDについては、『Oracle Database概要』を参照してください。
18.2 DBMS_APP_CONTのセキュリティ・モデル
アプリケーションでは、DBMS_APP_CONT
パッケージのEXECUTE
権限が必要です。
この権限を付与するには、データベース管理者が次のSQL文を実行する必要があります。
GRANT execute on DBMS_APP_CONT to application user ;
18.3 DBMS_APP_CONTサブプログラムの要約
DBMS_APP_CONT
パッケージには、GET_LTXID_OUTCOME
プロシージャが含まれています。
表18-1 DBMS_APP_CONTパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。 |
18.3.1 ADD_SQL_CONNECTION_TESTプロシージャ
このプロシージャは、計画メンテナンスが開始される前の、セッションの排出中に使用する新しい接続テストを追加します。このプロシージャは、SQL接続テストが標準テストでカバーされていない場合に使用します。このテストは、追加されたときに有効になります。オプションのサービス名修飾子が指定されている場合、テストはそのサービス名にのみ適用されます。
構文
DBMS_SESSION.ADD_SQL_CONNECTION_TEST ( connection_test IN VARCHAR2 service_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表18-2 ADD_SQL_CONNECTION_TESTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
接続のテストおよび排出に使用されるSQLテキスト。 |
|
オプションのサービス名修飾子。 |
使用上のノート
ADD_SQL_CONNECTION_TESTプロシージャ
は、計画メンテナンスが開始される前のセッション排出用の接続テストを追加します。接続テストはアプリケーションで使用され、排出対象としてマークされている接続をテストします。セッションは、サービスまたはPDBの停止操作および再配置操作で排出するために設定されます。排出中にRDBMSが接続をクローズするように設定されている場合は、計画メンテナンス中にエラーが表示されません。CONNECTION TESTは必要な数だけ入力できます。これらは、計画メンテナンス中にのみ使用されます。このテストは、すべてのRACインスタンスに適用されます。
サービス修飾子の可用性に関する最新の更新は、オンライン・ドキュメントを参照してください。
追加された接続を表示するには、ビューDBA_CONNECTION_TESTS
を問い合せます。
このプロシージャの所有者はSYS
であり、CDB$ROOT
レベルまたはPDB
レベル、またはマルチテナントでない場合はディクショナリ・レベルで実行するためにユーザーに付与されます。
18.3.2 DELETE_SQL_CONNECTION_TESTプロシージャ
このプロシージャは、計画排出で不要になった接続テストを削除します。テストを削除すると、PDBがオープンしているすべてのRACインスタンスにすぐに適用されます。
構文
DBMS_SESSION.DELETE_SQL_CONNECTION_TEST ( connection_test IN VARCHAR2 service_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表18-3 DELETE_SQL_CONNECTION_TESTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
接続のテストおよび排出に使用されるSQLテキスト。 |
|
オプションのサービス名修飾子。 オプションの |
使用上のノート
テストを削除する必要があるかどうかがわからない場合は、DISABLE_CONNECTION_TEST
プロシージャを使用して、テストを無効にできます。削除できるのはカスタムSQLテストのみです。事前定義済のテストは削除できません。サービス修飾子の可用性に関する最新の更新を確認してください。
このプロシージャの所有者は、CDB$ROOT
レベルまたはPDB
レベルではSYS
であり、マルチテナントでない場合はSYS
です。
接続テストとそのステータスをチェックするには、ビューDBA_CONNECTION_TESTS
を問い合せます。
18.3.3 DISABLE_CONNECTION_TESTプロシージャ
このプロシージャは、セッションの排出中に接続テストの使用を無効にします。テストを無効にすると、PDBがオープンしているすべてのRACインスタンスにすぐに適用されます。
構文
DBMS_SESSION.DISABLE_CONNECTION_TEST ( connection_test_type IN VARCHAR2, connection_test IN VARCHAR2, service_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表18-4 DISABLE_CONNECTION_TESTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
使用可能な値は次のとおりです。
|
|
接続のテストおよび排出に使用されるSQLテキスト。 このパラメータは、 |
|
オプションのサービス名修飾子。オプションのサービス名修飾子が指定されている場合は、そのサービス名に対するテストのみが有効になります。サービス名レベルでの無効化は、 |
使用上のノート
このプロシージャの所有者はSYS
であり、CDB$ROOT
レベルまたはPDB
レベル、またはマルチテナントでない場合はディクショナリ・レベルで実行するためにユーザーに付与されます。
接続テストとそのステータスをチェックするには、ビューDBA_CONNECTION_TESTS
を問い合せます。
18.3.4 ENABLE_CONNECTION_TESTプロシージャ
このプロシージャは、計画メンテナンスの前のデータベース・セッション排出用の接続テストの使用を有効にします。テストを有効にすると、PDBがオープンしているすべてのRACインスタンスにすぐに適用されます。
構文
DBMS_SESSION.ENABLE_CONNECTION_TEST ( connection_test_type IN VARCHAR2, connection_test IN VARCHAR2, service_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表18-5 ENABLE_CONNECTION_TESTプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
計画メンテナンスの前の排出用の接続テストを管理するときに使用される接続タイプ。接続テストについては、ADD、DELETE、ENABLE、DISABLEプロシージャを参照してください。 使用可能な値は次のとおりです。
|
|
計画メンテナンスが開始される前にRDBMSで接続をテストおよび排出するために使用されるSQLテキスト。 このパラメータは、 |
|
オプションのサービス名修飾子。オプションのサービス名修飾子が指定されている場合は、そのサービス名に対するテストのみが有効になります。サービス名レベルでの有効化は、より高いレベルでの無効化よりも優先されます。つまり、PDBを有効化でき、サービスは無効になります。 |
使用上のノート
-
このプロシージャの所有者は
SYS
であり、CDB$ROOT
レベルまたはPDB
レベル、またはマルチテナントでない場合はディクショナリ・レベルで実行するためにユーザーに付与されます -
ENABLE_CONNECTION_TEST
により、計画メンテナンス中のセッション排出用の接続テストが有効になります。有効化操作は、PDB
がオープンしているすべてのRACインスタンスに適用されます。これは、データベースの再起動後も維持されます。 -
このプロシージャの所有者は
SYS
であり、CDB$ROOT
レベルまたはPDB
レベル、またはマルチテナントでない場合はディクショナリ・レベルで実行するためにユーザーに付与されます。
18.3.5 GET_LTXID_OUTCOMEプロシージャ
このプロシージャは、セッションが使用できなくなったときに、カスタマ・アプリケーションとサード・パーティ・アプリケーションで最後のセッションのトランザクション・ステータスを確認できるようにします。
構文
DBMS_APP_CONT.GET_LTXID_OUTCOME ( client_ltxid IN RAW, committed OUT BOOLEAN, user_call_completed OUT BOOLEAN)
パラメータ
表18-6 GET_LTXID_OUTCOMEプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
クライアント側の論理トランザクションID。前回失敗したセッションから |
|
指定した論理 |
|
すべての情報がクライアントに戻されたかどうか。このようなメッセージの例として、自動コミットまたはコミットを正常に使用できたときに処理された行数、PL/SQLコール時のパラメータとファンクションの結果、または |
例外
表18-7 GET_LTXID_OUTCOMEプロシージャの例外
例外 | 説明 |
---|---|
|
サーバーの情報が最新であるため、トランザクションは古くてすでにコミットされたものです。アプリケーションから渡された |
|
クライアントがサーバーより進んでいます。これは、サーバーがフラッシュバックされた場合やメディア・リカバリを使用してリカバリされた場合、またはデータ損失を伴いながらも早期にオープンされたスタンバイである場合に発生することがあります。 |
|
|
|
同じユーザー名を持つ別のユーザーによって |
|
結果を確認できません。処理中にエラーが発生しました。エラー・スタックにエラーの詳細が示されています。 |