バージョン 8.1.3
 —  コマンドリファレンス  —

Adabas コマンドについて

このセクションでは、Adabas コマンドの概要を示します。コマンドは、機能ごとにデータベース問い合わせ、データベース更新、データストレージ読み込み、アソシエータ読み込み、論理トランザクション処理、および特殊処理コマンドに分類できます。

また、データ保護、リカバリ、およびユーザー再スタートに関連する Adabas コマンド機能についても説明します。 トランザクションという概念を紹介し、ET ロジックオペレーションについて説明します。 ET ロジック(レコードのホールド/解放、およびリソースのデッドロック回避)ユーザーと排他制御ユーザーを対象に競合更新について説明します。また、全ユーザータイプを対象に非アクティビティタイムリミットについても説明します。

このドキュメントでは、次のトピックについて説明します。


コマンドの種類

コマンドは、次の機能に分類することができます。

データベース問い合わせコマンド(Sx

データベース問い合わせコマンド(S1/S4、S2、S5)は、指定した検索条件に応じて、レコードまたはレコードグループの ISN を検索して返します。 その他のこの分類に属するコマンド(S8、S9)は、後から処理するための準備として、ISN 結果リストをソートします。

Sx コマンドで作成した ISN リストは、Adabas WORK データセットに格納しておくと、後でユーザーセッション中に取り出すことができます。

これらのコマンドはほとんどの場合、実際にはデータベースを読み取りません。ISN はアソシエータのインバーテッドリストから直接読み込まれます。 任意で、実行結果の ISN レコードをホールド状態にして、そのレコードが解放されるまで他のユーザーによる更新を防止できます。また、必要に応じて、先頭の ISN レコードに含まれているフィールド値をデータストレージから読み込むことができます。

注意:
Adabas データベースにおける非ディスクリプタ値の検索は、メインフレームの場合とオープンシステムの場合とで、フィールド内の空値省略に関して違いがあります。 オープンシステムではフィールドが空値省略(NU)の場合、非ディスクリプタ値を検索したときに空値を含むレコードを返しません。メインフレームシステムでは、非ディスクリプタ値を検索したときにフィールドの空値省略(NU)は無視されます。 このときフィールドを非ディスクリプタ値の検索で使用する必要がある場合は、オープンシステムフィールドの空値省略(NU)オプションを解除してこの問題を解決することをお勧めします。

このセクションでは、次のデータベース問い合わせコマンドについて説明します。

S1/S4

S1/S4 コマンドでは、指定された検索条件を満たすレコードを選択します。

S1/S4 コマンドでは、検索条件を満たすレコードの数と、それらのレコードの ISN を記載したリストを返します。 オプションとして、ISN 結果リストの先頭にある ISN のレコードをデータストレージから読み込むこともできます。

S4 コマンドを使用すると、ISN リストの先頭にある ISN のレコードをホールド状態にすることができます。 ホールドされたレコードが解放されるまで、他のユーザーはそのレコードを更新できません。

S2

S2 コマンドでは、選択したレコードの ISN をユーザー指定のディスクリプタのソート順で返すことを除いて、S1 コマンドと同じです。 1~3 個のディスクリプタを使用できます。 昇順または降順を指定できます。

S5

S5 コマンドでは、指定した ISN を持つ一方のファイル中のレコードとカップリングされた他方のファイル中のレコードの ISN を選択します。

コマンドには、カップリングされた ISN を返すファイルと ISN、およびカップリングされたレコードを選択するファイルを指定します。 Adabas は、ISN にカップリングされたレコードの数と、そのカップリングされた ISN のリストを返します。

S8

S8 コマンドでは、以前に S1/S4、S5、S8、S9 のいずれかのコマンドで作成した 2 つの ISN リストに論理演算(AND、OR、または NOT)を実行します。

S9

S9 コマンドでは、以前に S1/S4、S2、S5、S8、S9 のいずれかのコマンドで作成した ISN リストをソートします。

ISN リストは、ISN(昇順に限る)または 1~3 個のユーザー指定ディスクリプタ(昇順または降順)でソートできます。

データストレージ読み込み(L1~L6)

L1~L6 コマンドは、データストレージから実際のレコードを読み込みます。 指定したコマンドおよびそのオプションに応じて、レコードは格納されている順、データベース問い合わせコマンドのいずれかで作成した ISN リストの順、またはユーザー指定のディスクリプタによる論理順に、個別に読み込まれます。

ホールドオプションを使うと、専用のコマンドでレコードを解放するか、トランザクションが終了するまで、データベースレコードをロックできます。

このセクションでは、次のデータストレージ読み込みコマンドについて説明します。

L1/L4

L1 コマンドでは、データストレージから単一レコードを読み込みます。 コマンドには、ファイル番号、読み込むレコードの ISN、および値を取得するフィールドを指定します。 Adabas は要求フィールドの値を返します。

L4 コマンドは、レコードをホールド状態にすることを除いて、L1 コマンドと同じです。 レコードが解放されるまで、他のユーザーはレコードを更新できません。

マルチフェッチ/プリフェッチオプションは、セッションベースまたはコマンドベースでレコードをプリフェッチします。 これにより、複数のレコードフェッチによって生じるオーバーヘッドが減少します。 マルチフェッチオプションは、プラットフォームに依存しません。

GET NEXT オプションを使用すると、ISN を指定することなく、ISN リスト内の ISN で識別されるレコードを読み込むことができます。 通常、ISN リストは以前の Sx コマンドによって作成されたものです。

レスポンスコードオプションを指定すると、他のユーザーがレコードをホールドしているために L4 コマンドがレコードをホールドできない場合、レスポンスコード 145 が返されます。 それ以外の場合は待機状態になり、その状態は ISN(およびレコード)が解放されるか、または待機をもたらしているユーザーのトランザクションがタイムアウトするまで続きます。

ISN 順オプションを使用すると、レコードを ISN 順に読み込むことができます。 指定した ISN が存在する場合は、該当する ISN のレコードが読み込まれ、存在しない場合は、次に高い ISN のレコードが読み込まれます。

L2/L5

L2 コマンドでは、ファイルからレコードをデータストレージに物理的に格納されている順で読み込みます。 コマンドには、ファイル番号と値を取得するフィールドを指定します。 Adabas は要求フィールドの値を返します。

L5 コマンドは、読み込んだレコードをホールド状態にすることを除いて、L2 コマンドと同じです。 レコードが解放されるまで、他のユーザーはレコードを更新できません。 マルチフェッチ/プリフェッチオプションおよび レスポンスコードオプション(上記の L1/L4 コマンドの説明を参照)は、L2/L5 コマンドにも適用できます。

L3/L6

L3 コマンドでは、データストレージからレコードをユーザー指定ディスクリプタの論理順で読み込みます。 コマンドには、ファイル番号、順序制御に使用するディスクリプタ、および値を取得するフィールドを指定します。 Adabas は要求フィールドの値を返します。

L3/L6 コマンドのコマンドオプション 2 によって、レコードを昇順または降順のどちらで読み込むかを指定します。 また、コマンドオプション 2 を使用して、開始値も指定できます。

L6 コマンドは、読み込んだレコードをホールド状態にすることを除いて、L3 コマンドと同じです。 レコードが解放されるまで、他のユーザーはレコードを更新できません。

マルチフェッチ/プリフェッチオプションおよび レスポンスコードオプション(上記の L1/L4 コマンドの説明を参照)の他に、開始値オプションを使用してユーザー指定の値または ISN で読み込みを開始することもできます。

アソシエータ読み込み(L9、LF)

L9 コマンドと LF コマンドでは、アソシエータインバーテッドリストまたはフィールド定義テーブル(FDT)から直接情報を読み込みます。このコマンドによって返される値は、指定したディスクリプタのインバーテッドリスト値、または指定したデータベースファイルのフィールド定義のいずれかです。

このセクションでは、次のアソシエータ読み込みコマンドについて説明します。

L9

L9 コマンドでは、あるディスクリプタのインバーテッドリスト内の各値と、その値を持つレコード数を返します。

コマンドには、ファイル番号と値を取得するディスクリプタ、コマンド処理を開始する値を指定します。値は昇順または降順で返されます。

LF

LF コマンドでは、ファイルのフィールド定義を返します。 コマンドには、フィールド定義を取得するファイルを指定します。

ファイル内の全フィールドのフィールド定義が返されます。 各フィールド定義は、フィールド名、レベル番号、標準フォーマット、標準長、および定義オプションで構成されています。

データベース更新(A1、E1、N1/N2)

データベース更新コマンド(A1、E1、および N1/N2)は、データベースレコードを追加、変更、または削除し、関連するアソシエータリストを適宜更新します。 新しいレコードに自分で ISN を割り当てることも、Adabas によって割り当てることもできます。

このセクションでは、次のデータベース更新コマンドについて説明します。

A1

A1 コマンドでは、レコード内の 1 つ以上のフィールドの内容を更新します。 コマンドには、更新するレコードのファイル番号と ISN の他、更新するフィールドと更新する値も指定します。

Adabas は、アソシエータおよびデータストレージに必要な修正を行います。 アソシエータ更新が必要になるのは、ディスクリプタを更新する場合に限られます。

更新前にレコードをホールド状態にするホールドオプションを使用できます。

E1

E1 コマンドでは、レコードを削除したり、ファイルをリフレッシュしたりします。 削除する場合はレコードのファイル番号と ISN を指定し、ファイルをリフレッシュする場合は ISN やコマンド ID ではなくファイルのみを指定します。

Adabas は、アソシエータおよびデータストレージに必要な修正を行います。

削除前にレコードをホールド状態にするためのホールドオプションを使用できます。

N1/N2

N1/N2 コマンドでは、ファイルに新しいレコードを追加します。 コマンドには、レコードを追加するファイルの他、使用するフィールドとその値を指定します。 Adabas は、アソシエータおよびデータストレージに必要な修正を行います。

N1 コマンドを使用する場合、新規レコードの ISN は Adabas が割り当てます。 N2 コマンドを使用する場合、自分で ISN を指定する必要があります。

論理トランザクション制御コマンド(ET/BT)

Adabas 論理トランザクションは、実行中のデータベースオペレーションの論理的な開始(BT)と終了(ET)を定義します。 論理トランザクションコマンドを使用する主な目的は、ユーザーまたは Adabas の異常終了時、正常に処理されなかった最後のトランザクションからユーザーを再開できるようにすることです。 ET/BT コマンドでは、トランザクションの開始と終了を定義し、トランザクションの正常終了を妨げる状況が発生した場合にはこのトランザクションを処理する前の状態にリストアし、トランザクションシーケンスで書き込まれたプログラム指定のユーザーデータを読み込みます。

これらのコマンドを使用するプログラムを ET ロジックプログラムと呼びます。 必須ではありませんが、ET ロジックを使用することをお勧めします。

このセクションでは、次の論理トランザクション制御コマンドについて説明します。

BT

BT コマンドでは、現在処理中のトランザクションをバックアウトします。

トランザクションで実行した更新処理は削除され、トランザクションでホールド状態にされたレコードはすべて解放されます(ただし、マルチフェッチオプションによってホールドされたレコードを除きます。詳細については、「マルチフェッチ処理」セクションを参照してください)。

ET

ET コマンドでは、論理トランザクションの終了を示します。

ET コマンドを実行すると、トランザクションに関連したデータプロテクション情報がすべて物理的に格納されます。 トランザクションで実行した更新処理を物理的にデータベースに適用する前に、現在の Adabas セッションが終了した場合、Adabas はこのデータプロテクション情報を使用して、このトランザクションによる更新処理を次の Adabas セッション開始時に適用します。

ET コマンドでは、トランザクションの処理中、ホールド状態になっているレコードをすべて解放します(ただし、マルチフェッチオプションによってホールドされたレコードを除きます。詳細については、「マルチフェッチ処理」セクションを参照してください)。 また ET コマンドを使用して、Adabas システムファイルにユーザーデータの格納もできます。 このデータは、OP または RE コマンドで読み込むことができます。

特殊コマンド

特殊コマンドは、Adabas データベース環境をメンテナンスするのに必要な維持管理の役割を多数行います。 このグループのコマンドでは、次の機能を実行できます。

このセクションでは、次の特殊コマンドについて説明します。

CL

CL コマンドでは、ユーザーセッションを終了し、このユーザー用にホールドされていたレコードをすべて解放します。

C1

C1 コマンドでは、チェックポイントを取得します。

C1 コマンドでは、現在のデータプロテクション情報をすべてデータプロテクションログに物理的に書き込み、チェックポイントエントリをデータプロテクションログおよびシステムチェックポイントファイルに書き込みます。 このチェックポイントエントリは、後で更新を取り消したり、再適用したりするための参照ポイントとして使用できます。 C1 コマンドでは、オプションで、バッファフラッシュを初期化することもできます。

C3

C3 コマンドは排他制御更新ユーザー(ET ロジックを使用していないユーザー)のみが発行できるコマンドで、その機能は Adabas チェックポイントファイルに SYNX-03 チェックポイントを書き込むことです。

コマンドオプション 2 を指定すると、再スタート用にユーザーデータも Adabas チェックポイントファイルに格納されます。 格納されたデータは、後続の OP コマンドまたは RE コマンドで読み取れます。

C5

C5 コマンドでは、ユーザーデータを Adabas データプロテクションログに書き込みます。

後で ADASEL ユーティリティを使用して、このデータを読み込むことができます。

HI

HI コマンドでは、レコードをホールド状態にします。 ホールド状態にするレコードがあるファイルとその ISN を指定します。

レコードがホールド状態になると、解放されるまで他のユーザーは更新できません。

OP

OP コマンドは、下記に該当する場合に必須です。

また、ホールド状態にできる最大レコード数、および同時にアクティブにできるコマンド ID の最大数を設定する場合にも使用できます。

RC

RC コマンドを使用すると、現在割り当てられている 1 つ以上のコマンド ID を解放したり、1 つまたはすべてのグローバルフォーマット ID を削除したりできます。

RE

RE コマンドでは、以前に CL コマンドまたは ET コマンドで Adabas システムファイルに格納したユーザーデータを読み込みます。

RI

RI コマンドでは、ホールド状態からレコードを解放します。

解放するレコードのファイルと ISN を指定します。 また、現在自分がホールドしているすべてのレコードを解放するように要求することもできます。 RI コマンドは、非 ET ユーザーのみが発行してください。

Top of page

トランザクションと ET ロジック

このセクションでは、トランザクションの概念および ET ロジックユーザーについて説明します。また、トランザクションの通常終了処理および異常終了処理、ユーザー(ET)データの格納および取得など、ET ロジックオペレーションについても説明します。

このセクションでは、次のトピックについて説明します。

論理トランザクションとは

論理トランザクションとは、データベース内の情報を論理的に矛盾のないものにするために、ひとまとめに実行する必要がある(ユーザーが定義した)最小業務単位です。 論理トランザクションコマンドを使用するユーザーを ET ロジックユーザーと呼びます。

論理トランザクションは、論理的な業務単位を完了するために必要に応じてデータベースを読み込んだり、更新したりする 1 つ以上の Adabas コマンドで構成されています。 論理トランザクションは、レコードをホールド状態にするコマンドで始まり、同じユーザーに対して ET、BT、CL、OP のいずれかのコマンドを発行した時点で終了します。

RE(ET データの読み込み)コマンドを使用すると、ET コマンドまたは CL コマンドで格納したユーザー再スタートデータを取得できます。

トランザクションシーケンス番号

Adabas は、プログラムから ET コマンドまたは CL コマンドが発行されると、ET コマンドまたは CL コマンドのコントロールブロックのコマンド ID フィールドにトランザクションシーケンス番号を返します。 トランザクションシーケンス番号は、ユーザーセッション中に発行された ET コマンドの総数です。

ユーザーが発行した最初の ET コマンドは、トランザクションシーケンス番号 1 に設定されます。 OP コマンドに続く最初の ET コマンドは、コマンド ID フィールドまたは Adabas コントロールブロックにトランザクションシーケンス番号 2 を返します。 後続の各 OP コマンドは、同じユーザーが最後に発行した ET コマンドのトランザクションシーケンス番号を返します。

ET トランザクションタイムリミット

Adabas では、ET ロジックを使用するプログラムにトランザクションタイムリミットを設定できます。 トランザクション時間の測定は、最初のコマンドがレコードをホールド状態にした時点から始まり、プログラムが ET、BT、CL のいずれかのコマンドを発行した時点で終了します。

タイムリミットは、ADARUN TT パラメータで設定します。特定のユーザーのトランザクションタイムリミットを変更するには、OP コマンドを使用します。このタイムリミットは、ADARUN MXTT パラメータで制御します。

トランザクションが所定のタイムリミットを超えると、Adabas は BT(トランザクションのバックアウト)コマンドを生成します。 BT コマンドでは、トランザクションで実行した更新処理をすべて削除し、ホールドしたレコードをすべて解放します。

ユーザーが次にコマンドを発行すると Adabas からレスポンスコード 9 が返されて、現在のトランザクションがバックアウトされたことが示されます。 ユーザーは、バックアウトされたトランザクションを初めから繰り返すことも、他のトランザクションを開始することもできます。

トランザクションのバックアウト(BT)コマンド

BT コマンドでは、現在処理中のトランザクションですでに実行した更新処理をすべて削除します。 この処理は、プログラムエラーやタイムアウトが発生した場合、またはトランザクションを正常に完了できない場合に必要になります。

BT コマンドでは、暗黙で ET コマンドも実行します。つまり、マルチフェッチオプションで特に指定されない限り、トランザクションでホールドされたレコードをすべて解放します。詳細については、「マルチフェッチ処理」セクションを参照してください。

例えば、次のコマンドシーケンスを実行したとします。

FIND (S4)
  UPDATE (A1) (modify field XX to value 20)
  FIND (S4)
  UPDATE (A1) (modify field YY to value 50)
  END TRANSACTION (ET)
  FIND (S4)
  UPDATE (A1) (modify field XX to value 10)
  BACKOUT TRANSACTION (BT)

その結果、フィールド値は XX=20 および YY=50 となります。 フィールド XX に対する 2 番目の更新が、BT コマンドによって削除されます。

自動バックアウト

自動バックアウトは ET ロジックユーザーに対してのみ実行され、異常終了したセッションで自動的にトランザクションをバックアウトします。 Adabas は、内部 BT(トランザクションのバックアウト)、続いて 自動再スタートを実行してから、レスポンスコード 9 を返して、最後のトランザクションがバックアウトされたことを示します。

自動バックアウトは、HALT で終了したニュークリアスセッションの最後に発生します。

また、自動バックアウトは、Adabas が異常終了した次の Adabas セッションの始めにも実行され、ET ロジックユーザーが前回のセッションで実行した不完全なトランザクションによる更新をすべて削除します。

レスポンスコード 9 でトランザクションのバックアウトが示された場合、ユーザーはトランザクションを最初から再発行するか、または別のトランザクションを開始するかを選択できます。

バックアウトされたトランザクションを再開する場合は、端末オペレータがトランザクションのデータを再入力するか、またはトランザクションの更新フェーズの最初から内部での再開を実行する必要があります。トランザクションの更新フェーズは、レコードをホールド状態にする最初のコマンドから始まります。

エンドトランザクション(ET)コマンド

ET コマンドは、論理トランザクションの終了時点で発行しなければなりません。 ET コマンドが正常に実行されると、後続のユーザーまたは Adabas セッションの中断に関係なく、トランザクションで実行した更新処理がすべて物理的にデータベースに適用されます。

ET コマンドが正常に実行されなかった場合は、トランザクションで実行した更新処理が自動バックアウトルーチンでバックアウトされます(「自動バックアウト」を参照)。

マルチフェッチオプションで特に指定されない限り、ET コマンドはトランザクションでユーザーがホールドしたレコードをすべて解放します。 Adabas は、ユニークなトランザクションシーケンス番号を返します(「トランザクションシーケンス番号」を参照)。この番号を使用すると、監査や再開目的でトランザクションを特定できます。

また ET コマンドを使用して、Adabas システムファイルにユーザーデータの格納もできます。 このデータはユーザー再スタートのために使用でき、OP コマンドまたは RE コマンドで読み込むことができます。

ユーザープログラム Adabas
FIND(S4)、UPDATE(A4) レコードは Adabas バッファ内で更新されるが、必ずしもデータベースに書き込まれるわけではない
FIND(S1)、HOLD ISN(HI)、UPDATE(A4) レコードは Adabas バッファ内で更新されるが、必ずしもデータベースに書き込まれるわけではない
トランザクションの終了(ET) トランザクションのデータプロテクション情報を Adabas ワークおよびデータプロテクションログに書き込み、トランザクションを終了します。
FIND(S4)、UPDATE(A4) レコードは Adabas バッファ内で更新されるが、必ずしもデータベースに書き込まれるわけではない
FIND(S1)、HOLD ISN(HI)、UPDATE(A4) レコードは Adabas バッファ内で更新されるが、必ずしもデータベースに書き込まれるわけではない
Adabas またはユーザーセッション中断

次の Adabas セッションが始まるか、またはユーザーがタイムアウトした時点で、トランザクション 1 のどちらの更新も物理的にデータベースに書き込まれます(まだ書き込まれていなかった場合)。 トランザクション 2 の更新は、このトランザクションでは ET コマンドが処理されなかったため、物理的に書き込まれません(またはバックアウトされます)。

ユーザー(ET)データ

ユーザーデータ(ET データ)は、ET コマンドまたは CL コマンドを使用して格納し、OP コマンドまたは RE(ET データの読み込み)コマンドを使用して読み込むことができます。

ユーザー ID ごとにユーザーデータのレコードが 1 つ保持されます。 データは、ユーザーデータが指定される次の ET コマンドまたは CL コマンドが発行されるまで保持されます。

各ユーザーデータレコードは、トランザクションで書き込まれたチェックポイントを使用して Adabas データプロテクションログにも書き込まれます。 このデータは、後で ADASEL ユーティリティを使用して読み込むことができます。

ユーザーデータは、主に、次の機能を実行するのに使用します。

また、次の機能を実行するには、ユーザーデータ機能を使用することをお勧めします。

ユーザーデータを提供する ET コマンドと、提供しない ET コマンドを別々に扱うことをお勧めします。 この 2 種類の ET コマンドを組み合わせると、(一時的に格納されている)Adabas WORK データセットからプロテクションログにユーザーデータが繰り返しコピーされるため、余分なオーバーヘッドが発生します。

Adabas ユーザー ID

ユーザー ID は、Adabas がユーザー(ET)データを格納および取得し、ユーザーに特別な優先権を割り当てるのに使用する ID です。 ユーザー ID は OP コマンドのアディション 1 フィールドに指定します。

ユーザーが指定するユーザー ID は、次の条件の両方を満たす必要があります。

ユーザー ID を指定しなかった場合や、無効なユーザー ID を指定した場合は、Adabas がユーザーセッションのデフォルトのユーザー ID を設定し、ユーザーが格納した ユーザー(ET)データを現在のセッションが終了したときに削除します。

後で制限を受けることがないように、常にユーザー ID を指定するようにしてください。

Top of page

競合更新

競合更新は、2 人以上のユーザー(マルチユーザーモード)が同一 Adabas ファイル(複数の場合もあり)を更新するときに発生します。

このセクションでは、競合更新環境でデータ保全性を確保するのに使用される Adabas 機能について説明します。 具体的には、レコードのホールドと解放の処理、リソースのデッドロックの回避、および排他制御更新について説明します。

このセクションでは、次のトピックについて説明します。

ET ユーザーレコードホールド

レコードホールド機能を使用すると、ET ユーザーはレコードをホールド状態にして更新処理を実行し、その処理の間は他のユーザーが同じレコード更新できないようにすることができます。 Adabas は、レコードの ISN をホールドキューに格納して、レコードをホールドします。このため、レコードホールドは ISN ホールドとも呼ばれています。

レコードホールドは、ET ロジックユーザーに適用されます。Adabas は EXU(排他制御更新)ユーザーに対しては ISN をホールド状態にしません。 詳細については、「排他制御更新」を参照してください。

このセクションでは、次のトピックについて説明します。

レコードホールドコマンド

ホールド付き検索コマンド(S4)、ホールド付き読み込みコマンド(L4、L5、L6)、ホールドオプションを指定した A1 コマンドまたは E1 コマンド、あるいはレコードホールドコマンド(HI)を発行すると、レコードはホールド状態になります。 また、ET ロジックユーザーが N1/N2 コマンドを発行すると、追加されたレコードはホールド状態になります。

これらのどのコマンドが正常に完了しても、レコード(ISN)はホールド状態になります。 レコードがすでに他のユーザーによってホールドされている場合、レコードホールドコマンドを発行したユーザーは、レコードが使用可能になるまで待機状態になります。使用可能になった時点で、Adabas はコマンドを実行します。

レコードホールドコマンドに R(リターンコード)または O(マルチフェッチ/リターンコード)オプションを指定して発行すると、ホールドしようとするレコードが他のユーザーにホールドされている場合、Adabas はユーザーを待機状態にするのではなく、レスポンスコード 145 を返します。

検索(S1)または 読み込み(L1、L2、L3)コマンドを発行した場合は、レコードが他のユーザーにホールドされていてもレコードにアクセスできます。

ホールドオプションを使用したレコード更新

ホールド状態にしたレコードを更新または削除するには、A1 コマンドまたは E1 コマンドを発行します。

A1 コマンドは、要求したユーザーに対してレコードがホールド状態にある場合、またはホールド状態にないレコードのホールドを指定した場合にのみ実行できます。 レコードが現在他のユーザーにホールドされている場合、ホールド要求は待機状態になります。ただし、レスポンスコード 145 を受け取るように要求することもできます。 レコードがホールド状態でない場合は、レスポンスコード 144 が返され、レコードがホールド状態であったことが示されます。

E1 コマンド(ホールドオプションなし)をホールド状態にないレコードに対して発行した場合、そのレコードが他のユーザーに対してホールド状態でない限り、レコードはホールド状態になります。 削除するレコードをホールド状態にしないと、E1 コマンドを発行する前に、他のユーザーがそのレコードを更新または削除してしまう可能性があります。

N1/N2 コマンドを発行したときに、ホールドキューに使用可能なスペースがなかった場合、レスポンスコード 145 が返されます。

レコード解放

ET ロジックユーザーがレコードをホールド状態から解放するには、各論理トランザクションの後に ET コマンドを使用するか、Adabas セッションの終わりに クローズ(CL)コマンドを使用します。 現在のトランザクションで更新を行った場合は、ET ロジックを使用するプログラムでレコード解放(RI)コマンドを発行してレコードのホールドを解放しないでください。解放すると、データ保全性が失われることがあります。

例えば、ET ユーザー 1 がレコードを更新してから、RI コマンドでそのレコードを解放し、その後もトランザクションが続くとします。 その間に、ユーザー 2 が同じレコードを更新し、ET コマンドでセッションを終了します。 この場合、エラーやタイムアウトのためにユーザー 1 のトランザクションがバックアウトされると、ユーザー 2 のトランザクションが ET コマンドで正常に完了していても、両者(ユーザー 1 と 2)の行った更新は削除されます。

このため、ET ロジックを使用するユーザープログラムでは、論理トランザクションの完了時に、ET コマンドでレコードを解放する必要があります。 非 ET ロジックユーザーは、A1 コマンドまたは E1 コマンドでレコードの更新や削除を行い、レコードを解放する必要があります。

マルチフェッチオプションを使用すると、ET(または BT)コマンドの発行時に ISN バッファ内にゼロ以外のカウントとファイル番号/ISN を指定している場合に限り、対象となるレコード(およびその ISN)を選択してホールド状態から解放できます。 詳細については、「マルチフェッチ処理」セクションを参照してください。

CL コマンドでは、このユーザーが ET ロジックを使用しているかどうかにかかわらず、このユーザーに対してホールド状態にあるレコードをすべて解放します。

リソースのデッドロックの回避

2 人のユーザーが互いに相手のホールド状態にあるレコードを要求したために、両ユーザーとも待機状態になった場合には、リソースのデッドロックが発生します。

Resource Deadlock Example

リソースデッドロックの例

Adabas は、ユーザー 2 を待機状態にする前にデッドロックの可能性を検出し、2 番目のユーザーにレスポンスコード 145 を返します。

排他制御更新

ユーザーセッションの実行中に他のユーザーがファイルを更新できないように、1 つ以上の Adabas ファイルに対する排他制御を要求できます。

排他制御を要求するには、OP コマンドを使用します。要求したファイルが他のユーザーまたはユーティリティにより更新モードでオープンされていない場合に限り、排他制御権が付与されます。 要求したファイルがない場合、OP コマンドはレスポンスコード 48 を返します。

排他制御は、ファイルの競合更新を防ぐだけではありません。他のユーザーの動作に関係なくファイルをリストアできるため、リカバリ手順を単純化できます。

ユーザーが排他制御を持つファイルに対して、レコードホールドコマンドを使用する必要はありません(ただし、使用することは可能です)。 Adabas は、排他ファイル制御で更新されるファイルに対しては、ホールドロジック処理を無効にします。

排他制御ユーザーは、非 ET ロジックユーザーとみなされるため、ET タイムアウト制限による制御を受けません。 ただし、非 ET ロジックユーザーが ET コマンドを発行した場合、ユーザーは自動的に ET ロジックユーザーになり、何らかの理由でレコードをホールド状態にすると、トランザクションタイムアウト制限が課せられます。 このようなユーザーは、終了するか、またはタイムアウトになるまで、排他制御を保持します。

排他制御更新を行うユーザーは、C1 コマンドを使用して、チェックポイントの取得を要求できます。 C1 チェックポイントは、チェックポイント後に適用した更新を削除したり、チェックポイント前に適用した更新を再適用したりするための参照ポイントとなります。

Top of page

非アクティビティタイムリミット

非アクティビティタイムリミットは、全ユーザー(アクセスオンリー、ET ロジック、排他制御)に適用されます。 ADARUN TNAA、TNAE、TNAX の各パラメータを使用すると、ユーザータイプごとに異なる非アクティビティタイムリミットを定義できます(詳細については、「Adabas の初期化(ADARUN ステートメント)」を参照)。

また、ユーザーは OP コマンドで任意に非アクティビティタイムリミットを設定できます。最大値は ADARUN MXTNA パラメータで制御します。 詳細については、「OP コマンド:ユーザーセッションのオープン」を参照してください。

次の図は、ユーザーが非アクティビティタイムリミットを超えたときに Adabas が実行する処理をまとめたものです。

Transaction and Non-Activity Time Limits

トランザクションと非アクティビティ タイムリミット

このセクションでは、次のトピックでこれらの Adabas 処理について説明します。

ET ロジックユーザー

ET ロジックユーザーの場合、Adabas は次の処理を実行します。

次の状況のいずれかが発生した場合、Adabas は次にコマンドが発行されたときにレスポンスコード 9 をユーザーに返します。

タイムアウトが発生したときにユーザーが ET 状態であった場合、このユーザーが OP コマンドに空白以外のユーザー ID を指定していないと、UQE も削除されます。

排他ファイル制御ユーザー(EXF)

排他ファイル制御ユーザーの場合、Adabas は UQE 内のユーザーのファイルリストを削除します。 これにより、ユーザーは排他制御を行っていたファイル(複数可)に対する排他制御権を失います。

また、ユーザーに対するコマンド ID はすべて解放され、ユーザーはアクセスオンリーユーザーになります。

アクセスオンリーユーザー

アクセスオンリーユーザーの場合、Adabas は UQE 内のユーザーのファイルリストを削除します。

Top of page