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

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


機能および使用

ET コマンドは、次の 2 つの目的で使用されます。

  • 論理トランザクションの終了(コマンドオプション「S」の指定なし)。

  • サブトランザクションの終了(コマンドオプション「S」の指定あり)。

論理トランザクションの終了

コマンドオプション「S」のない ET コマンドは、次の結果になります。

  • トランザクション中に正しく実行されたすべての更新コマンドについて、現在のデータプロテクション情報すべてを Adabas データプロテクションログと Adabas ワークファイルに書き込みます。この情報は、Adabas の次回のセッション開始時に、トランザクション中に実行されたすべての更新を適用するために必要になります。この適用が実行されるのは、これらの更新がアソシエータおよびデータストレージに物理的に適用される前に現在のセッションが異常終了(システム障害)した場合のみです。

  • コマンドオプション「H」を使用すると、ユーザーの排他的ロックすべてが共有ロックにダウングレードされます。使用しないと、(マルチフェッチオプションなしの場合は)ユーザーがホールドしているレコードすべてが解放され、(マルチフェッチオプションありの場合は)ISN バッファに指定されたレコードすべてが解放されます。

  • オプションとして、Adabas システムファイルにユーザーデータを格納できます。このユーザーデータは、後続の OP コマンドまたは RE コマンドで読んだり、プログラムを再スタートしたりするために使用できます。

  • トランザクションの一意なシーケンス番号を返します。再スタートが必要な場合に、このシーケンス番号を使用して、最後に正しく処理が完了したトランザクションを識別できます。

  • サブトランザクションがアクティブになっている場合は、現在のトランザクションの最後のサブトランザクションの終了。つまり、遅延している一意性チェックや参照整合性チェックは、すぐに実行されます。

  • 一意性エラーの場合は、現在のサブトランザクションがバックアウトされ、レスポンスコード 98 が返されます。参照整合性エラーの場合は、現在のサブトランザクションがバックアウトされ、レスポンスコード 196 が返されます。サブトランザクションをアクティブにし、かつサブトランザクションを使用しなかった場合(つまり、コマンドオプション「S」で ET コマンドを使用しなかった場合)、トランザクション全体がロールバックされます。

    注意:
    例えば、参照整合性定数でカスケードされた削除を指定した場合、参照整合性チェックは、多数のデータベース操作を示す可能性があります。

  • サブトランザクションがアクティブにされている場合は、次のトランザクションの最初のサブトランザクションの開始。セーブポイント ID 0 で新しいセーブポイントが定義されます。

論理トランザクションの終了が正しく実行されると、後続のユーザーセッションまたは Adabas セッションの中断に関係なく、トランザクション中に実行されたすべての更新がデータベースに適用されます。

graphics/et_1.png

ET Command - End of Logical Transaction, Procedure Flow

graphics/et_2.png

ET Command - End of Logical Transaction, Procedure Flow (continued)

サブトランザクションの終了

コマンドオプション「S」を使用した ET コマンドは、次の結果になります。

  • 現在の Adabas ユーザーセッションでサブトランザクションが有効になっていない場合、レスポンスコード 22 が返され、アディション 2 フィールドの最初の 2 バイトが 19 に設定されます。

  • 遅延した一意性チェックがある場合は、すぐに実行されます。一意性エラーの場合は、現在のサブトランザクションがバックアウトされ、レスポンスコード 98 が返されます。参照整合性エラーの場合は、現在のサブトランザクションがバックアウトされ、レスポンスコード 196 が返されます。

    注意:
    例えば、参照整合性定数でカスケードされた削除を指定した場合、参照整合性チェックは、多数のデータベース操作を示す可能性があります。

  • 次のサブトランザクションの開始。新しいセーブポイント ID が定義されます。このセーブポイント ID は、コントロールブロックのコマンド ID フィールドに返されます。前のセーブポイントの後にロックまたは更新アクティビティがなかった場合、新しいセーブポイント ID が前のセーブポイント ID と同じになる可能性があります。

    注意:
    通常、セーブポイント ID は 1 ずつ増えます。一部の文書化されていない内部コマンドでは、内部サブトランザクションが作成されます。したがって、これらのコマンドを使用すると、より大きなセーブポイント ID が生成される可能性があります。

注意:
論理トランザクションの終了はコミットを意味します。つまり、後続のユーザーセッションまたは Adabas セッションの中断に関係なく、トランザクション中に実行されるすべての更新がデータベースに適用されることが保証されます。サブトランザクションの終了時にコミットはありません。バックアウトサブトランザクションを使用すると、トランザクション全体がコミットされるまで、論理トランザクションに属するすべてのサブトランザクションをバックアウトできます。

graphics/et_sub.png

ET Command - End of Subransaction, Procedure Flow

コントロールブロック

Field フォーマット  
コールタイプ B F/U
予約(内部使用)   -/-
コマンドコード A F/U
コマンド ID B -/A
File Number B F/U (1)
Response Code B F/A (1)
レコードバッファ長(ACB のみ) B $ F/U
ISN バッファ長(ACB のみ) B F/U (1)
コマンドオプション 1 A F/U
コマンドオプション 2 A F/U
コマンドオプション 3(ACBX のみ) A F/U
アディション 2 A、B -/A
コマンドタイム B -/A
ユーザーエリア   F/U

バッファエリア

バッファ  
フォーマットバッファ $ */-
レコードバッファ $ F/U
サーチバッファ */– (2)
バリューバッファ */– (2)
ISN バッファ F/U (2)
フォーマット:
A 英数字
B 2 進数
x/y Adabasコール前/後 - xとyは、値を取ることができます。
A Adabas によって設定
F ユーザーによって設定
U Adabas コール後も変更なし
- 使用しません
* 使用せず。ただし、コールステートメントのパラメータリストに含まれていなければならない。
$ユーザーデータを格納する場合のみ

(1)このフィールドの意味は、Call タイプに指定された値によって異なります。詳細については、「Adabas コール」の「コントロールブロック」を参照してください。
(2)マルチフェッチ機能が使用されている場合に限ります。

コントロールブロック

コマンドコード

ET

コマンド ID

Adabas は、このフィールドにトランザクションのシーケンス番号を返します。この番号はバイナリ形式です。

トランザクションシーケンス番号は、ユーザーセッション毎に 1 から始まる昇順の番号です。トランザクションが更新を行わなかった場合に、0 の値が返ります。

Response Code

このフィールドには、コマンドに対するレスポンスコードが返されます。レスポンスコード 0 は、このコマンドが正しく実行されたことを示します。

レコードバッファ長(ACB のみ)

Adabas システムファイルにユーザーデータを格納する場合、このフィールドに格納データのバイト数を指定する必要があります。

Adabas は、このフィールドに指定されたバイト数のデータを格納します。指定可能な最大バイト数は、2000 バイトです。

ユーザーデータを格納しない場合、このフィールドは使用しません。

ISN バッファ長(ACB のみ)

ISN バッファ長(バイト単位)を示します。このバッファはマルチフェッチ機能とともに使用します。指定する値は 4 + (ISN数 * 8) 以上でなければならず、それより小さい場合は、マルチフェッチ機能が無視されます。

コマンドオプション 1

このフィールドが「S」に設定されている場合は、サブトランザクションの終了が実行され、そうでない場合は、論理トランザクションの終了が実行されます。このフィールドが空白のときは、現トランザクションでホールド状態のレコードがすべて解放されます。このフィールドが「M」に設定されている場合、ISN バッファに指定された ISN だけがホールドから解放されます。詳細については、「プログラミングの考慮事項」の「マルチフェッチ機能」を参照してください。

このフィールドを "T" に設定すると、ET コマンドは現在のユーザーセッションが使用中の全リソースを解放します。これは、レコードバッファを "." に設定し、コマンドオプション 1 を前の OP コマンドと同じ値に設定して、CL コマンドと OP コマンドを続けて実行するのと等価です(ただし、より効率的)。

注意:
"T" オプションは、"R" オプションなしで OP コマンド実行した後に使用するために導入されました。"R" オプション付きの OP コマンドを実行した後で、"T" オプション付きで ET コマンドを実行した場合、ファイルへのアクセスを含むその後のすべてのコマンドはレスポンスコード 17 を受け取ります。これは、誤って ET コマンドに "T" オプションを使用した場合は、ファイルリストにすでに含まれているファイル以外のファイルへのアクセスが禁止されるためです。

コマンドオプション 2

このフィールドが E のときは、ユーザーデータを Adabas システムファイルに格納することを示します。

コマンドオプション 3(ACBX のみ)

このフィールドが[H]に設定されている場合、すべてのロックされたレコードはホールド状態を維持しますが、排他的ロックは共有ロックにダウングレードされます。

アディション 2

このフィールドには、一部のレスポンスコードについて詳細情報が返されます。詳細については、『メッセージおよびコードマニュアル』 を参照してください。

レコードバッファ

Adabas システムファイルに格納したいユーザーデータを、このバッファに指定します。

データは、当ユーザーが次に ET データ付きの ET コマンド、または CL コマンドを発行するまで保存されます。ユーザーデータは、空白以外のユニークなユーザー ID を指定した OP コマンドを発行した場合にのみ、ユーザーセッション終了時に保存されます。

ユーザーデータには任意の形式を使用できます。Adabas によってデータの形式が変換されることはありません。

ISN バッファ

このバッファには、ロック解除する ISN とファイル番号が含まれます。このバッファはマルチフェッチ機能とともに使用します。ロックを解除するレコードがない場合、このバッファの先頭 4 バイトをゼロに設定する必要があります。

ISN バッファの詳細なレイアウトについては、「プログラミングの考慮事項」の「マルチフェッチ機能の使用(トランザクション制御)」を参照してください。

ISN バッファ

ET コマンドの "M" オプションを使用している場合は、現在のトランザクションによってホールドされているレコードのサブセットを解放できます。解放するレコードは ISN バッファに指定します。

ISN バッファの先頭 4 バイトは、ISN バッファに続く 8 バイト要素の数を指定します。この値が 0 の場合は、レコードがホールド状態から解放されることはありません。各 8 バイト要素は、ホールド状態から解放されるレコードを指定します。各エントリの先頭 4 バイトにはファイル番号が含まれ、次の 4 バイトには ISN が含まれています。ファイル番号と ISN はともに、符号なし整数として指定する必要があります。

ファイル番号/ISN がこのユーザーに対してホールドされていない場合は、ISN バッファの処理が無効なエントリで終了し、レスポンス 144 が返されます。コントロールブロックのアディション 2 フィールドは、無効なエントリのインデックスに設定されます(先頭エントリのインデックスは 0)。コントロールブロックのファイル番号フィールドと ISN フィールドはそれぞれ、無効なエントリのファイル番号と ISN に設定されます。

ISN バッファ長が ISN バッファに必要なスペースより小さい値に設定されている場合は、"M" オプションが無視され、すべての ISN がホールド状態から解放され、レスポンス 53 が返されます。

例 1:ユーザーデータなしの ET

コントロールブロック:

Command Code          ET
Command Option 2      b (blank; no user data is to be stored)

例 2:ユーザーデータ付きの ET

コントロールブロック:

Command Code          ET
Record Buffer Length  25 (25 bytes of user data to be stored)
Command Option 2      E (user data to be stored)

バッファエリア:

Record Buffer         User Data For Transaction