概要

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


Adabas コマンドの概要

Adabas は、データベースオペレーションを行うパワフルで柔軟なコマンドを提供しています。

ここでは、Adabas コマンドの概要を説明します。

コマンドは、機能ごとに以下のように分類されます。

データベース問い合わせ

データベース問い合わせを行うには、S1、S2、および S4 コマンドを使用します。S8 および S9 コマンドは、データベース問い合わせで作成された ISN リストの特殊処理を行います。

S1/S4

S1/S4 コマンドは、指定検索条件を満足するレコードの集合を選択します。検索条件には、1 つのフィールド/派生ディスクリプタまたは論理演算記号で結ばれた複数のフィールド/派生ディスクリプタを使用できます。

S1/S4 コマンドは、指定検索条件を満足するレコードの集合を選択します。検索条件内では、ディスクリプタと非ディスクリプタの両方を使用できます。ディスクリプタのみを使用する場合、問い合わせを(データストレージにアクセスせず)インバーテッドリストのみで解決する必要があります。検索条件にディスクリプタが含まれていない場合、S1/S4 コマンドはファイル内の各レコードを読み込んで、問い合わせを解決します。

Adabas は S1/S4 コマンドの実行結果として、検索条件を満たすレコードの数と選択レコードの ISN リストを返します。

オプションとして、実行結果の ISN リスト中の先頭 ISN を持つレコードを同時にデータストレージから読み込むこともできます。

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

S2

S2 コマンドでは、選択したレコードの ISN をユーザー指定の検索条件のソート順で返すことを除いて、S1 コマンドに類似しています。また、検索条件には非ディスクリプタフィールドを指定できます。昇順または降順を指定できます。

S8 および S9

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

論理演算として AND(論理積)、OR(論理和)、NOT を使用できます。

AND は、2 つの ISN リストに共通する ISN のリストを作成します。

OR は、2 つの ISN リストのどちらかに入っている ISN のリストを作成します。

NOT は、第 1 ISN リストにあって、第 2 ISN リストに存在しない ISN のリストを作成します。

S9 コマンドは、先に S1/S4、S2、S8 または S9 コマンドで作成された ISN リストをソートします。

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

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

上記いずれかの Sx コマンドで作成した ISN リストは、現在のユーザーセッションで後から読み込めるように Adabas 一時ワークスペースに格納できます。

データストレージ読み込み

L1~L6 コマンドは、データストレージからレコードを読み込むために使用します。

L1/L4

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

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

GET NEXT オプションは、ユーザーが ISN を指定せずに、ISN リスト内の ISN で識別されるレコードを順に読み込むために用います。

READ ISN SEQUENCE オプションは、レコードを ISN 順に読み込むのに使用します。ユーザー指定の ISN が存在する場合は指定 ISN のレコードを読み、ない場合は次に高い ISN のレコードを読み込みます。

L2/L5

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

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

L3/L6

L3 コマンドでは、ユーザー指定ディスクリプタの論理順にデータストレージからレコードを読み込みます。ユーザーは、ファイル番号、順序制御に用いるディスクリプタ、および値を求めるフィールドを指定します。コマンドの開始および/または終了する値、および値を求めるフィールドが返されます。レコードは、指定したディスクリプタの値の昇順または降順で返されます。

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

アソシエータ読み込み

L9 および LF コマンドは、アソシエータから直接情報を読み込みます。

L9

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

ユーザーは、ファイル番号と値を求めたいディスクリプタ、コマンド処理を開始および/または終了する値を指定します。

値は昇順で返されます。

LF

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

ユーザーは、フィールド定義情報を得たいファイルを指定します。

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

データベース更新

A1、E1、および N1/N2 コマンドは、データベース更新を行います。A1 で更新するレコードまたは E1 で削除するレコードは、更新や削除を行う前にホールドされていなければなりません。

A1

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

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

E1

E1 コマンドは、レコードの削除を行います。ユーザーは、削除するレコードのファイル番号と ISN を指定します。

Adabas によって、アソシエータおよびデータストレージに必要な修正が行われます。

N1/N2

N1/N2 コマンドでは、ファイルに新しいレコードを追加します。ユーザーは、レコードを追加するファイル番号と使用フィールドとその値を指定します。

Adabas によって、アソシエータおよびデータストレージに必要な修正が行われます。

N1 コマンドを使用する場合、新規レコードの ISN は Adabas によって割り当てられます。N2 コマンドを使用する場合は、ユーザーが ISN を与えます。

論理トランザクション処理

BT、ET、および RE コマンドは、論理トランザクション処理に使用します。論理トランザクションコマンドを使用する主な目的は、ユーザーまたは Adabas の異常終了時に、正常に処理された最後のトランザクションの後から、ユーザーが再開できるようにすることです。サブトラクションのコンセプトにより、完全なトランザクションではない、現在のトランザクション内の業務単位をバックアウトすることができます。

BT

BT コマンドは、現在処理中のトランザクションまたは 1 つ以上のサブトランザクションをバックアウトします。

トランザクション中に行われた更新、追加、削除のすべての処理は除かれ、トランザクション中にホールド状態にされた全レコードは解放されます。

ET

ET コマンドは、現在のトランザクションまたはサブトランザクションの終了を示します。

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

ET コマンドは、トランザクション中にホールド状態になっていた全レコードを解放します。

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

RE

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

チェックポイント

C1 コマンドは、Adabas のチェックポイントまたはユーザーに対して使用します。

C1

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

C1 コマンドにより、現在の全データプロテクション情報をデータプロテクションログに物理的に書き、チェックポイントエントリをデータプロテクションログとシステムチェックポイントファイルに書き出します。このチェックポイントエントリは、後続で更新取り消しまたは更新再適用のための参照ポイントとして必要となります。

特殊処理コマンド

CL

CL コマンドは、ユーザーセッションを終了します。

CL コマンドにより、現在の全データプロテクション情報をデータプロテクションログに書き込み、現在ユーザーに対しホールド状態にある全レコードを解放し、現在ユーザーに割り当てている全コマンド ID(および対応する ISN リスト)を解放し、また Adabas システムファイルにユーザーデータを格納します(オプション)。

C5

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

HI

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

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

MC

MC コマンドは、他のコマンドを単一マルチコール内のサブコールとして一緒にまとめます。

MC コマンドは、ACB インターフェイスでのみ使用できます。MC コマンドを ACBX インターフェイスで実行した場合の結果は未定義です。この動作は、今後のアップデートパッケージの 1 つで変更される可能性があります。

OP

OP コマンドは、ユーザーセッションの開始を示します。OP コマンドは、次のユーザー指定が必要です。

  • 排他制御更新ユーザー

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

  • 後続のセッションで読む必要のあるユーザーデータを Adabas システムファイルに格納したいユーザー

  • 特別な優先権を割り当てられたユーザー

  • データベースのファイルの一部に限定されたユーザー

  • サブトランザクションを使用するユーザー

RC

RC コマンドは、現在アクティブなコマンド ID(または全コマンド ID)を解放します。

RI

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

解放するレコードの ISN とファイル番号を指定します。またユーザーは、ひとつも更新されなかった、現在ホールド状態にある全レコードを解放することも要求できます。

ユーザータイプ

ユーザーが行うファイルのアクセスおよび更新の種類によって、Adabas はいくつかのユーザータイプを認識します。

  • アクセスオンリーユーザー(ユーザータイプ "AC")

  • ET ロジックユーザー(ユーザータイプ "ET")

  • 排他制御ユーザー(ユーザータイプ "EX")

  • 排他制御更新ユーザー(ユーザータイプ "EX,ET")

  • ユーティリティユーザー(ユーザータイプ "UT")

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

アクセスオンリーユーザーは、ファイルに対して読み取り専用のアクセスを行います。このユーザーはレコードのホールド、更新、削除、追加、および ET または BT コマンドは発行できません。

注意:
共有ロックは、データの読み込みのみを行うユーザーにも有用なように思われますが、共有ロックには ET ユーザーでのみサポートされているトランザクションも必要です。そのため、レコードを共有または排他的ホールド状態にする L4~6 コマンドおよび S4 コマンドは、通常、アクセスオンリーユーザーには許可されません。アクセスオンリーユーザーは、ダーティリード操作のみを実行できます。

OP コマンドを発行するときに、レコードバッファに ACC パラメータだけを指定すると、このユーザーは現セッションでアクセスオンリーユーザーになります(詳細については、OP コマンド参照)。

アクセスオンリーユーザーは、ADAOPR DISPLAY=UQ の Type 欄に AC で表示されます。

ET ロジックユーザー

ET ロジックユーザーは、現在のセッションにトランザクションロジックを使用します(詳細については、「論理トランザクション処理」セクション参照)。これは、トランザクション進行時に更新される全レコードを、ホールド状態にしておかなければならないことを意味します。トランザクションは、ET、BT、または CL コマンドで終了しなければなりません。そうしないと、トランザクション全体が、対応するトランザクション継続タイムリミット(TT)を超えてからバックアウトされます(詳細については、「タイムリミット」参照)。

ET ロジックユーザーは ET 状態または他の状態になります。ET 状態であるということは、このユーザーがホールドしているレコードは 1 つもないことを表します。

ユーザーは、次のいずれかの場合に ET ロジックユーザーになります(詳細については、OP コマンド参照)。

  • レコードバッファに UPD パラメータを指定して、OP コマンドを発行するとき

  • OP コマンドを指定しないで、セッションを開始するとき(暗黙の OP コマンド)

ET ロジックユーザーは、ADAOPR DISPLAY=UQ の Type 欄に ET で表示されます。

排他制御ユーザー

排他制御ユーザーは、ファイルをオープンして、読み込みおよび更新を実行します。他のユーザーがそのファイルにアクセスする際は、読み取り専用に制限するか、排他制御ユーザーセッションがアクティブな間は一切アクセスできないようにします。

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

排他制御ユーザーのファイルアクセスには、次の 2 つのタイプがあります。

  • 排他ファイル更新:ファイルを更新するためにオープンします。他のユーザーはファイルを読み込めますが、更新できません。OP コマンドを発行するときに、レコードバッファに EX Uパラメータを指定すると、このユーザーは、現セッションで排他ファイル更新のできる排他制御ユーザーになります(詳細については、OP コマンド参照)。

  • 排他ファイルオープン:ファイルを更新するためにオープンします。他のユーザーは、ファイルを読み込むことも更新することもできません。OP コマンドを発行するときに、レコードバッファに EX Fパラメータを指定すると、このユーザーは、現セッションで排他ファイルオープンを実行できる排他制御ユーザーになります(詳細については、OP コマンド参照)。

一般的に、排他制御ユーザーセッションはトランザクションロジックを使用しません(次の「排他制御更新ユーザー」項目参照)。このセッションでは、開始時に OPEN チェックポイント、終了時に CLSE チェックポイントが出力されます。

レコードホールドコマンドを使用するかどうかは、現ファイルのオープンモードだけでなく、ユーザータイプによっても決まります。ET ロジックを操作する排他制御ユーザーは、ファイルを排他更新モードで開いているかどうかに関係なく、レコードの変更前に、実際のトランザクション処理の場合と同じ方法ですべてのレコードをホールド状態にする必要があります。排他制御ユーザーだけが、ISN ホールドロジックを使用しないで排他モードでオープンされたファイルのレコードを更新できます。

排他制御ユーザーはファイルリストに更新ファイルを追加できません。しかし、これは排他制御更新ユーザーにとって可能です(詳細については、次のセクション参照)。

排他制御を実行しているユーザーは、C1 コマンドを使用して書き込みするチェックポイントを使用することができます。チェックポイント後に適用された更新を取り除いたり、チェックポイント前に適用された更新を再度適用したりするための参照ポイントとして、このチェックポイントを後で使用できます。

排他制御ユーザーは、ADAOPR DISPLAY=UQ の Type 欄に EX で表示されます。

排他制御更新ユーザー

排他制御ユーザーが現セッションでトランザクションロジックを使用したいときに当てはまります。これは、ユーザーがファイルに排他更新したにもかかわらず、トランザクションロジックを使用して、そのすべての更新を実行することを意味します。OPEN および CLSE チェックポイントは、排他制御ユーザーの場合と同様に、セッションの開始と終了に書き出されます。

ET ロジックを操作する排他制御ユーザーは、ファイルを排他更新モードで開いているかどうかに関係なく、レコードの変更前に、実際のトランザクション処理の場合と同じ方法ですべてのレコードをホールド状態にする必要があります。

ユーザーは、次のいずれかの場合に排他制御更新ユーザーになります(詳細については、OP コマンド参照)。

  • レコードバッファに排他ファイル更新(EXU)または排他ファイルオープン(EXF)および同時に起こるファイル更新(UPD)パラメータを指定して、OP コマンドを発行するとき

  • 排他制御ユーザーセッションで ET コマンドを発行するとき

排他制御更新ユーザーは、ファイルリストに更新ファイルを追加できます。これは排他制御ユーザーにはできません。

排他制御を実行しているユーザーは、C1 コマンドを使用して書き込みするチェックポイントを使用することができます。チェックポイント後に適用された更新を取り除いたり、チェックポイント前に適用された更新を再度適用したりするための参照ポイントとして、このチェックポイントを後で使用できます。

排他制御更新ユーザーは、ADAOPR DISPLAY=UQ の Type 欄に EX,ET で表示されます。

ユーティリティユーザー

ユーティリティユーザーは、Adabas ユーティリティを使用してセッションを開始する場合に定義されます。

ユーティリティユーザーは、ADAOPR DISPLAY=UQ の Type 欄に UT で表示されます。

競合データベースアクセス

このセクションでは、競合更新環境でデータ保全性を確保するのに使用される Adabas 機能について説明します。

競合データベースアクセスは、2 人以上のユーザーが同じ Adabas ファイル(複数可)にアクセスするときに発生します。Adabas は、このような状況で発生する可能性がある次の完全性の問題に対処します。

  • 更新トランザクション - 2 人のユーザーが同時に同じレコードを更新したときに、更新が失われてはなりません。

  • 読み込みトランザクション - 同じトランザクションで複数のレコードが更新された結果として、検索トランザクションで見つかったレコードが整合しないことがあってはなりません。この場合、一部のレコードが更新前の状態になっていて、一部のレコードが更新後の状態になります。

このセクションでは、共有ロックと排他的ロックの取得と解除、リソースのデッドロック、および排他制御更新について説明します。

この目的のために、Adabas はレコードの共有ロックまたは読み込み(S)ロック、および排他的ロックまたは書き込み(X)ロックをサポートしています。

  • レコードの排他的ロックを取得しているユーザーも、レコードの排他的ロックを待機しているユーザーもいない場合にのみ、レコードの共有ロックを取得できます。同じレコードに対して、複数のユーザーが共有ロックを同時に持つことができます。レコードの共有ロックを取得することを、レコードを共有ホールド状態にするともいいます。

  • ユーザーは、他のユーザーがレコードの共有ロックまたは排他的ロックを持っていない場合にのみ、レコードの排他的ロックを取得できます。レコードの排他的ロックを取得することを、レコードを排他的ホールド状態にするともいいます。

  • これらのロックは、必要となるすべての完全性要件を満たすのには不十分です。Adabas は、まずどのレコードが検索条件を満たすかを判断し、結果のレコードのロックを順次取得します。そのため、レコードの読み込み時に、一部のレコードがすでに検索条件を満たさなくなっている可能性や、すべてのレコードが処理される前に、検索条件を満たす他のレコードが新たに存在している可能性があります。共有ロックと排他的ロックだけでは不十分な場合は、更新のためにファイル全体をロックできます。

レコードロックコマンド

FIND WITH HOLD コマンド(S4)、READ WITH HOLD コマンド(L4、L5、L6)、または HOLD ISN コマンド(HI)を発行すると、レコードはロックされます。また、ET ロジックユーザーが N1/N2 コマンドを発行すると、追加されたレコードは排他的ホールド状態になります。適切なオプションを指定した A1 コマンド、および E1 コマンドでも、レコードが排他的にロックされます。

これらのいずれかのコマンドが正しく完了すると、そのレコード(ISN)は共有ロックまたは排他的ロックされます。レコードがすでに他のユーザーによってロックされていてロックできない場合、レコードホールドコマンドを発行したユーザーは、レコードが使用可能になるまで待ち状態に置かれます。使用可能になった時点で、Adabas はコマンドを再度有効化します。

レコードホールドコマンドに RETURN(R)オプションを付けて発行すると、ホールドしようとするレコードが他のユーザーにホールドされている場合、Adabas はユーザーを待機状態におかずに、レスポンスコード 145 を返します。

FIND(S1)または READ(L1、L2、L3)コマンドを発行するユーザーは、レコードが他ユーザーにロックされていてもレコードを読み込めます(ダーティリード)。

HI、L4、L5、L6、S4 コマンドを使用したレコードのロック

コマンド HI、L4、L5、L6 および S4 に適切なコマンドオプション 3 を指定して、所定のロックタイプを指定できます(次の表を参照)。ロックを許可できない場合、Adabas は次の処理を行います。

  • RETURN オプションを指定して Adabas コマンドを発行した場合、Adabas はレスポンスコード 145 を返します。

  • Adabas がデッドロック状態を検出した場合、Adabas はレスポンスコード 9 を返し、デッドロック状態を解決するためにトランザクションをロールバックします。

  • そうでない場合、Adabas は要求したロックモードが許可されるか、トランザクションタイムリミットを超えるまでコマンドの実行を中断します。

RETURN オプションは、コマンドオプション 1 で指定します。これはマルチフェッチオプションを使用するかどうかの指定にも使用します。次の表に、コマンドオプション 1、マルチフェッチオプションおよび RETURN オプション間のマッピングを示します。

コマンドオプション 1 マルチフェッチオプション RETURN オプション
M ×
O
R ×
空白 × ×

ロックタイプはコマンドオプション 3 で指定します。このコマンドオプションは、共有ロックが再度解除されるタイミングも指定します。次の表に、コマンドオプション 3 の使用法を示します。

コマンドオプション 3 ロックタイプ ロックが解除されるタイミング
空白 X
  • トランザクションの終了またはバックアウト

  • RI コマンド(レコードが更新されていない場合のみ)

C(HI では指定不可) S
  • 読み込みコマンドの最後(レコードが別のコマンドによってまだロックされていない場合のみ)

Q(マルチフェッチとともに指定することは不可、L4 はコマンドオプション 2 = N の場合のみ、S4 は空白/ゼロ以外の CID および ISN バッファ長 4 の場合のみ、HI では指定不可) S
  • この読み込みシーケンスの次の順次読み込みコマンドまたは RC の開始時。複数のコマンドシーケンスでコマンドオプション Q を使用して同じレコードが読み込まれた場合、これらのすべてのコマンドシーケンスで次のレコードが読み込まれたとき、または RC が実行されたときにのみ解放されます。別のコマンドが同じレコードを排他的にロックしている場合、またはコマンドオプション S を使用してレコードが共有ロックされている場合、レコードは解放されません。

  • コマンドオプション S で共有ロックされたレコードを解放するいずれかのイベント。

S S
  • トランザクションの終了またはバックアウト

  • バックアウトサブトランザクション

  • RI コマンド

注意:

  1. S4 コマンドは、最初のレコードのみをホールド状態にします。
  2. C オプションは、現在の読み込み処理後、レコードを共有ホールド状態に維持することなく、ダーティリードを回避します。
  3. Q オプションを使用して、同じレコードに対して整合性のある複数の読み込み処理を実行できます。読み込みシーケンスの次のレコードが読み込まれると、レコードは再び解放されます。次のレコードが読み込まれる前に、現在のトランザクションがコミットまたはロールバックされた場合も、ロックが解除されます。
  4. コマンドオプション空白、Q、または S に定義されている時間が経過する前に、RI コマンドを使用してロックを解除することもできます。ただし、排他的なロックは、レコードが現在のトランザクションで更新されていない場合にのみ解除されます。
  5. コマンドオプション 3 は ACB には含まれていないので、共有ロックは ACBX インターフェイスでのみサポートされます。

ホールドオプション使用のレコード更新

ユーザーに対して排他的ホールド状態になっている任意のレコードは、A1 または E1 コマンドを発行して更新/削除できます。

A1 コマンドは、レコードが排他的ホールド状態にある場合や、H、R、L、T、' のいずれかのオプションが指定されている場合にのみ実行されます。これらのいずれのオプションも使用せず、かつレコードがホールド状態ではない場合は、レスポンスコード 144 が返されます。レコードが他のユーザーによって現在ロックされていて、かつ R または U オプションが指定されている場合は、レスポンスコード 145 が返されます。レコードが他のユーザーによって現在ロックされていて、かつ H または L オプションが指定されている場合、A1 コマンドはレコードが再び使用可能になるまで待機します。デッドロックが検出された場合は、レスポンスコード 9 が返されます。

A1 コマンドでの T オプションの使用方法の詳細については、「プログラミングの考慮事項」の「システム生成フィールド」を参照してください。

このユーザーがホールドしていないレコードに対して E1 コマンドを発行する場合、Adabas は、他ユーザーがホールドしていなければ、そのレコードをホールド状態にします。レコードが他のユーザーによって現在ロックされていて、かつ R オプションが指定されている場合は、レスポンスコード 145 が返されます。R オプションがない場合は、E1 コマンドはレコードが再び使用可能になるまで待機します。デッドロックが検出された場合は、レスポンスコード 9 が返されます。

E1 コマンドの発行前、削除するレコードを読み込んだときに、それをホールド状態にしないとします。この場合は、E1 コマンドの実行前に、他のユーザーが当該レコードを更新/削除しないことは保証されません。

ホールドキューレスポンスコードの概要

Adabas がデッドロック状態を検出し、バックアウトトランザクションを実行してデッドロックを解決すると、レスポンスコード 9 が返されます。

1 ユーザーがホールドできる最大レコード数(ADANUC および ADAOPRのNISNHQ パラメータ)に達すると、レスポンスコード 47 が返ります。

レスポンスコード 144 は、A1 コマンドが発行され、そのレコードがユーザーに対してホールド状態でないときに返されます。

レスポンスコード 145 は、次の状態が起こるときに返されます。

  • ホールド状態に置くレコードを要求するコマンドが発行され、そのレコードがすでに他のユーザーにホールドされていて、かつ RETURN オプション(コマンドオプション 1 に R がセットされている)がそのコマンドで指定されていたとき。この場合、アディション 2 フィールドに 0 が返ります。

  • A1、E1、または N1/N2 コマンドが発行され、レコードに対する使用可能なエントリがホールドキューに存在しなかった場合、アディション 2 フィールドに 16 進値 FFFFFFFF が返ります。

レコードのロック解除

トランザクションをコミットまたはロールバックする ET、BT、CL、または OP コマンドは、ユーザーがロックしたすべてのレコードのロックを解除します。ET および BT の場合は、レコードのサブセットのロックを維持することもできます。

単一レコードのロックは、RI コマンドでも解除できます。ただし、レコードが現在のトランザクションで更新されている場合、ロックは解除されません。

以下の例は、レコードホールドロジックに基づいて、コマンドが待機する方法を示しています。

     USER 1                 USER 2                           USER 3

     S4 with CO3=S:
     Find ISN 1 and 2
     Shared lock for ISN 1
     Read ISN 1

                            S4 with CO3=C:
                            Find ISN 1 and 2
                            Shared lock for ISN 1
                            Read ISN 1
                            Release shared lock for ISN 1

                                                            S4 with CO3=blank:
                                                            Find ISN 1 and 2
     L4 with CO3=S:                                         Wait for ISN 1
     Shared Lock for ISN 2                                  ¦
     Read next ISN 2                                        ¦
                                                            ¦
     L4 with CO3=S:                                         ¦
     EOF                                                    ¦
                                                            ¦
     ET:                                                    ¦
     Release ISNs 1 and 2                                   V
                                                            Exclusive lock for ISN 1
                                                            Read ISN 1

                                                            A1:
                                                            Update ISN 1

                                                            L4 with CO3=blank:
                                                            Exclusive lock for ISN 2
                                                            Read ISN 2

                           L4 with CO3=C:
                           Wait for next ISN 2
                           ¦                                A1:
                           ¦                                Update ISN 2
                           ¦
                           ¦                                ET:
                           ¦                                Commit updates
                           ¦                                Release ISNs 1 and 2
                           V
                           Read ISN 2

                           L4 with CO3=C:
                           EOF

レコードロックのアップグレードとダウングレード

ロックされていないレコードの排他的ロックを取得するコマンドと同じコマンドで、レコードロックを共有から排他へとアップグレードできます。

レコードロックは、コマンドオプション 3 = S を指定した RI コマンドで排他から共有にダウングレードできますが、レコードが現在のトランザクションで更新されていない場合に限ります。

トランザクション終了後もレコードをホールド状態に保つ

通常、トランザクションをコミットまたはロールバックすると、このトランザクションでロックされていたすべてのレコードがホールド状態から解放されます。ただし、一部またはすべてのレコードをホールド状態のままにすることもできます。

  • コマンドオプション 1 = M を指定した ET または BT コマンドを指定した場合は、ISN バッファに指定されたレコードのみがホールド状態から解放されます。ユーザーの残りのロックは変更されません。

  • コマンドオプション 3 = H を指定して ET または BT コマンドを指定した場合、ユーザーによってロックされたすべてのレコードはホールド状態を維持しますが、排他的ロックは共有ロックにダウングレードされます。

サブトランザクション

サブトラクションのコンセプトにより、完全なトランザクションではない、現在のトランザクション内の業務単位をバックアウトすることができます。Adabas では、サブトランザクションに、サブトランザクションの終了までの一意性チェックおよび参照整合性チェックの遅延が含まれます。

ユーザーセッションは、S オプションを指定した OP コマンドによってサブトランザクションで有効になります。この OP コマンドは、最初のサブトランザクションを開始します。

  • S オプションを指定した後続の ET コマンドは、現在のサブトランザクションを終了し、新しいサブトランザクションを開始します。セーブポイントが定義されます。セーブポイントは、このセーブポイントより後に実行されたデータベースのすべての更新を後でバックアウトできることを意味します。各セーブポイントにはセーブポイント ID があり、これは S オプションを指定した ET コマンドの Adabas コントロールブロックのコマンド ID フィールドに返されます。トランザクションの開始は、常にセーブポイント ID 0 になります。通常、セーブポイント ID は新しいサブトランザクションの開始時に 1 ずつ増えますが、前のサブトランザクションにロックや更新のアクティビティがない場合は、セーブポイント ID が変わらないことがあります。

  • S オプションを指定した後続の BT コマンドは、この BT コマンドで指定したセーブポイント後に実行されたすべての更新をバックアウトします。

    注意:
    ロールバックされたサブトランザクションで RI コマンドを実行した場合、レコードのロックは失われたままになります。その間に他のユーザーがレコードをロックしていた可能性があるので、これは必要な動作です。バックアウトサブトランザクションで ISN のロックがまだ必要な場合は、この ISN に対して RI コマンドは実行しないでください。

  • S オプション未指定の後続の BT コマンドは、現在の完全なトランザクションをバックアウトし、新しいサブトランザクションも開始します。

  • S オプション未指定の後続の ET コマンドは、現在の完全なトランザクションをコミットし、新しいサブトランザクションも開始します。

例:

この例では、次のコマンドシーケンスを想定しています。

ET=>CID=7… ET-S=>CID=1… ET-S=>CID=2… BT-S(CID=2)… ET-S=>CID=3… BT-S(CID=1)… ET=>CID=8

トランザクション終了時に返される CID と、サブトランザクション終了時に返される CID では、内容が異なることに注意してください。

  • トランザクション終了時には、コミットされたトランザクションのトランザクションシーケンス番号が返されます。

  • サブトランザクション終了時には、現在のセーブポイント ID が返されます。最初のサブトランザクションの開始時のセーブポイントは、常にセーブポイント ID 0 になります。したがって、ET 後の最初のサブトランザクション終了時のセーブポイント ID は、セーブポイント ID 1 になります。

最初の BT-S コマンドには CID=2 が指定されていて、最後のサブトランザクション(セーブポイント ID 2)がロールバックされ、ET-S=>CID=2 の後のすべての更新処理がロールバックされます。

2 番目の BT-S コマンドには CID=1 が指定されていて、前に開始されたサブトランザクションがロールバックされ、最後の ET-S=>CID=1 の後のすべての更新処理がロールバックされます。

つまり、トランザクションには、最終的に、左矢印が下にない右(黒)矢印がマークされた処理が含まれます。左(赤)矢印はロールバックされた更新処理を示します。

graphics/arrows.png

サブトランザクションまたはトランザクション全体に対して発行される BT コマンドとは無関係な BT コマンドの場合、以前の BT サブトランザクションですでにロールバックされている処理を再度ロールバックしてはなりません。

サブトランザクション内では、すべての Adabas コマンドと、それらの変更を WORK に記録するすべての Ux コマンドが許可されます。両方のコマンドタイプの組み合わせも使用できます。

注意:
レスポンスコード 9 が返された後にサブトランザクションロジックのあるユーザーセッションが消失した場合、サブトランザクションロジックを続行するには、S オプションを指定した新しい OP コマンドが必要です。

サブトランザクションの開始とロールバックは、常に WORK と PLOG に記録されます。

参照整合性

ファイルに対して参照整合性制約が定義されているとします。この場合、サブトランザクションの終了時(サブトランザクションがアクティブ化された場合)、およびファイルの STORE/UPDATE/DELETE コマンド終了時に参照整合性がチェックされます。参照整合性制約の定義方法の詳細については、『管理マニュアル』の「FDT のレコード構造」で「参照制約」を参照してください。

注意:
参照整合性チェックにより、暗黙的なデータベース処理(カスケード削除など)が多数発生する可能性があります。

リソースのデッドロック

2 人のユーザーが、相互に他方のユーザーに対して現在ホールド状態にあるレコードを要求しているため、両方とも待ち状態にあります。このとき、リソースのデッドロックが発生します。ただし、Adabas はこの状態を検出し、デッドロックを起こしたユーザーのトランザクションをバックアウトすることでこれを解決します。

デッドロック検出

           USER 1               ADABAS               USER 2
     READ WITH HOLD (L4)
     FILE 1 ISN 1
                           ISN 1 HELD FOR
                           USER 1
                                                 READ WITH HOLD
                                                 (L4) FILE 1 ISN 2
                           ISN 2 HELD FOR
                           USER 2
     READ WITH HOLD (L4)
     FILE 1 ISN 2
                           USER 1 MUST WAIT...
                           ISN 2 HELD BY USER 2
                                                 READ WITH HOLD
                                                 (L4) FILE 1 ISN 1
                           DEADLOCK DETECTED
                           THE CURRENT TRANSACTION
                           OF USER 2 IS BACKED OUT.
                           USER 2 RECEIVES RESPONSE 9
                           AND 'DEADLOCK DETECTED' IN
                           THE ADDITIONS 2 FIELD OF THE
                           CONTROL BLOCK.

タイムリミット

リソースのデッドロックは、トランザクションタイムリミットによって Adabas が自動的に解決します。

トランザクション時間の測定は、最初のコマンドがレコードをホールド状態に置いたときに開始し、プログラムが ET、BT、または CL コマンドを発行したときに終了します。

トランザクションが上記の制限を超えると、Adabas は BACKOUT TRANSACTION(BT) コマンドを自動的に生成します。これにより、トランザクション中の更新処理はすべて取り消され、トランザクション中にホールドされた全レコードは解放されます。ユーザーが次に発行するコールで、レスポンスコード 9 が返されます。

2 種類のタイムリミットを定義します。

  1. トランザクションタイムリミット(TT)、トランザクションを実行しなければならない最大待ち時間です。トランザクションタイムリミットは、ET ステータスにない ET ユーザーにのみ適用されます。

  2. 非アクティビティタイムリミット(TNAx)、ユーザーアクティビティがある一定時間起こらなかった場合に、アクションが取られるまでの時間です。

上記のタイムリミットの値は OP コール、ADANUC または ADAOPR で設定できます(詳細については、『Adabas ユーティリティ』を参照)。現在のセッションに対する OP コールに指定したユーザー定義の値は、ADANUC または ADAOPR で定義した値を上書きします。

これらのタイムリミットの値は、ADANUC または ADAOPR で設定できます(詳細については、『Adabas ユーティリティマニュアル』を参照してください)。

ユーザーアクティビティは、ADAOPR の STOP コマンドで止めることができます。

OPTIONS=OPEN_REQUIRED を指定してニュークリアスが稼動しているときにタイムリミットが超える場合は、次のアクションが行われます(ここで使用している短縮形は後で説明します)。

ユーザータイプ タイムアウト
TT TNAx STOP
ID ユーザー 非 ID ユーザー ID ユーザー 非 ID ユーザー
アクセスオンリー - SUQE CL SUQE CL
ET ステータスの ET ロジックユーザー - SUQE CL SUQE CL
ET ステータスでない ET ロジックユーザー BT、RSP9 BT、SUQE BT、SUQE
ET ステータスの ET ロジック使用排他制御ユーザー - CLSE チェックポイント、SUQE CLSE チェックポイント、SUQE
ET ステータスでない ET ロジック使用排他制御ユーザー BT、RSP9 BT、CLSE チェックポイント、SUQE BT、CLSE チェックポイント、SUQE
ET ロジック未使用排他制御ユーザー - CLSE チェックポイント、SUQE CLSE チェックポイント、SUQE
ユーティリティユーザー - - CL

OPTIONS=OPEN_REQUIRED を指定しないでニュークリアスが稼動しているときにタイムリミットを超えた場合は、次のアクションが行われます。

ユーザータイプ タイムアウト
TT TNAX STOP
アクセスオンリー - CL CL
ET ステータスの ET ロジックユーザー - CL CL
ET ステータスでない ET ロジックユーザー BT、RSP9 BT、CL BT、CL
ET ステータスの ET ロジック使用排他制御ユーザー - CL CL
ET ステータスでない ET ロジック使用排他制御ユーザー BT、RSP9 BT、CL BT、CL
ET ロジック未使用排他制御ユーザー - CL CL
ユーティリティユーザー - - CL

グローバルトランザクションから発生したユーザーキューエレメントの扱いは異なります。詳細については、『管理マニュアル』の「XA サポート」で「ユーザーキューの取り扱い」を参照してください。

SUQE(ユーザーキューエレメントのスクラッチ):全コマンド ID の解放およびファイルリスト、ユーザー ID(存在する場合)、ユーザータイプのスクラッチ。また、次のコールにレスポンス 9 を設定します。次のコールでレスポンス 9 を受け取ると、ユーザーキューエレメントは削除されます。このユーザーキューエレメントはタイムアウトになりやすい傾向があります(ユーザーキューエレメントの詳細については「OP コマンド」を参照)。

BT の意味:Adabas は、ユーザーの現トランザクションをバックアウトします。

CL の意味:Adabas は、ユーザーセッションをクローズします。

RSP9 の意味:Adabas は、次回のユーザーコマンドに対してレスポンスコード 9 を返します。

ID ユーザー:セッションのオープン時に ID を指定したユーザー。後でこのユーザーのアクティビティによって起こるログのエントリをマークするのに使用します。

以下の表は、ユーザー 1 が最終的にトランザクションタイムリミットを超過したために、Adabas がユーザー 1 のトランザクションをバックアウトし、したがってユーザー 2 が処理を再び続けることができるようになった例です。

Adabas は、ユーザー 1 が次のコマンドを発行したときにレスポンスコード 9 を返すことによって、ユーザー 1 の現在のトランザクションがバックアウトされたことを通知します。ユーザー 1 はバックアウトトランザクションを最初から繰り返すか、または別のトランザクションを発行できます。

トランザクションタイムリミットは、ET ロジックを用いるプログラムだけに適用されます。

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

           USER 1              ADABAS                 USER 2
                           ISN 1 HELD FOR
                           USER 1
                                                  READ WITH HOLD
                                                  (L4) FILE 1 ISN 2
                          ISN 2 HELD FOR USER 2
      READ WITH HOLD
      (L4) FILE 1 ISN 2
                           USER 1 MUST WAIT*
                          (ISN 2 HELD BY USER 2)
                                                  READ WITH HOLD
                                                  (L4) FILE 1 ISN 1
                           USER 2 MUST WAIT*
                          (ISN 1 HELD BY USER 1)
                           (BOTH USERS WAITING)
                           USER 1 HAS EXCEEDED
                           TRANS. TIME LIMIT.
                           ADABAS ISSUES BT
                           FOR USER 1.
                           ISN 1 RELEASED.
                           USER 1 NOTIFIED THAT
                           HIS TRANSACTION HAS
                           BEEN BACKED OUT
                           (RESPONSE CODE = 9).
                           ISN 1 READ AND HELD
                           FOR USER 2.
      USER 1 MAY                                  NEXT COMMAND
      REISSUE TRANSACTION
      OR ISSUE
      ANOTHER TRANSACTION.

(*) READ WITH HOLD コマンドに RETURN オプションを使用すると、ユーザーは待機状態に置かれず、代わりにレスポンスコード 145 が返されます。

graphics/nonacttl.png

Transaction and Non-Activity Time Limits

リカバリ/再スタート

ここでは、データプロテクション、リカバリ、およびユーザー再スタートに関する Adabas コマンド機能について説明します。

データベース更新を実行できる Adabas ユーザータイプ(ET ロジックユーザーと排他制御ユーザー)、各ユーザータイプのチェックポイント手順、および AUTOBACKOUT 機能について説明します。

ET ロジックユーザー

論理トランザクションコマンド ET、BT、および RE を使用して、トランザクションの再スタート機能を可能にします。トランザクション再スタートとは、前回のユーザーセッションで最後に正常終了したトランザクション後の最初のトランザクションから始まるユーザーセッションを開始できる機能です。論理トランザクションコマンドを使用するユーザーを ET ロジックユーザーと呼びます。

論理トランザクション

論理トランザクションとは、データベース内の情報が論理的に矛盾のないことを保証するために、ひとまとめに実行されなければならない最小の業務(ユーザーが定義した)の単位です。

論理トランザクションは、1 つまたは複数の Adabas コマンドから構成され、論理的な 1 業務単位を完了するのに必要なデータベースの更新も行います。論理トランザクションは、レコードをホールド状態におくコマンドで開始され、ET(BT または CL)コマンド発行時に終了します。

ET コマンド

ET コマンドは、論理トランザクションの終了時点で発行する必要があります。ET コマンドの実行完了により、トランザクション中に行われた更新処理のすべてが、後続のユーザーまたは Adabas セッションの中断に関係なく、物理的にデータベースへ適用されることを保証します。

ET コマンドが正常に実行されないと、トランザクション内で行われた更新処理は、Adabas によってバックアウトされます。

ET コマンドにより、トランザクション中でホールドされていた全レコードが解放されます。Adabas は、ユニークなトランザクションシーケンス番号を返します。ユーザーは更新内容の検証や再スタート時にこのシーケンス番号を使用し、該当トランザクションを識別できます。

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

ET コマンド

          USER PROGRAM                          ADABAS
      FIND (S4), UPDATE (A1)
                                       RECORD UPDATED IN ADABAS
                                       BUFFER BUT NOT NECESSARILY
                                       WRITTEN TO THE DATABASE
      FIND (S1), HOLD ISN (HI),
      UPDATE (A1)
                                       RECORD UPDATED IN ADABAS
                                       BUFFER BUT NOT NECESSARILY
                                       WRITTEN TO THE DATABASE
      END TRANSACTION (ET)
                                       DATA PROTECTION INFORMATION
                                       FOR THE TRANSACTION IS WRITTEN
                                       TO THE ADABAS WORK AND LOG
      FIND (S4), UPDATE (A1)
                                       RECORD UPDATED IN ADABAS
                                       BUFFER BUT NOT NECESSARILY
                                       WRITTEN TO THE DATABASE
      FIND (S1), HOLD ISN (HI),
      UPDATE (A1)
                                       RECORD UPDATED IN ADABAS
                                       BUFFER BUT NOT NECESSARILY
                                       WRITTEN TO THE DATABASE
      . . . ADABAS OR USER SESSION INTERRUPTION . . .

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

BT コマンド

BT コマンドは、現在処理中のトランザクション内ですでに行われたすべての更新処理を無効にするために発行します。これは、プログラムエラーのとき、または全トランザクションを完全に実行できないと判断したときに必要な機能です。

BT コマンドにより、トランザクション中にホールドされていた全レコードはホールド状態から解放されます。

コマンドシーケンス

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 コマンドにより無効になります。

Adabas は、ユーザートランザクションがトランザクションタイムリミット、または非アクティビティタイムリミットを超えると、自動的に BT コマンドを生成します。Adabas は、最後のトランザクションがバックアウトされたことをユーザーに示すために、レスポンスコード 9 を返します。バックアウトトランザクション中にホールドされていた全レコードは、ホールド状態から解放されます。

バックアウトの手続きは、

  • 異常終了したユーザーが発行した不完全なトランザクション内で実行したすべての更新を無効にします。

  • 2 ユーザー間のリソースのデッドロックを解決します(詳細については、「リソースのデッドロック」参照)。

アクティブユーザーに対して論理トランザクションがバックアウトされると、ユーザーはバックアウトトランザクションを再発行するか、別のトランザクションを発行します。

Adabas によって生成された BT コマンド(ユーザーはアクティブのまま)

FIND (S4)
UPDATE (A1)
FIND (S4)
UPDATE (A1)
END TRANSACTION (ET) (end transaction 1)

FIND (S4)
UPDATE (A1)
FIND (S4)
User must wait (record not available)

-------TRANSACTION TIME LIMIT EXCEEDED

BACKOUT  (BT) issued by Adabas; logical transaction
2 backed out; user receives response code 9 for  S4
command.

Adabas によって生成された BT コマンド(ユーザーはアクティブでなくなります)

FIND (S4)
UPDATE (A1)
FIND (S4)
UPDATE (A1)

-------USER PROGRAM TERMINATES ABNORMALLY

BACKOUT  (BT)  issued  by  Adabas; both updates are
backed out and all held records are released.

自動バックアウト

AUTOBACKOUT は、Adabas ニュークリアスによって Adabas セッションの始めに実行され、ET ロジックユーザーが発行した不完全なトランザクションでのすべての更新を無効にします。

AUTOBACKOUT(自動バックアウト)は、ET ロジックユーザーだけに実行されます。

システム生成フィールド

Adabas ファイルには、Adabas 自体によって値が自動的に生成されるフィールドを含めることができます。これらのフィールドのことをシステム生成フィールドといいます。

システム生成フィールドは、次の値を含むことができます。

  • レコードの作成日時または最終更新日時を示すタイムスタンプ。

  • レコードを作成したユーザー、またはレコードを最後に更新したユーザーに関する情報。

詳細については、『管理マニュアル』の「FDT のレコード構造」、「定義オプション」にある「システム生成フィールド」を参照してください。