作業論理単位

リカバリー不能 リソース (Windows 2000 のシリアル・ファイルなど) を変更した場合、その変更は比較的永続的なものになります。コードでも EGL ランタイム・サービスでも、この変更結果を予告なく取り消すことはできません。 リカバリー可能 リソース (データベースなど) を変更した場合、コードまたは EGL ランタイム・サービスでは、変更をコミットして永続的なものにするか、変更をロールバックして、最後に変更がコミットされた時点で有効であった内容に戻すかのいずれかができます。

以下のリソースをリカバリーできます。
  • リレーショナル・データベース
  • リカバリー可能として構成されている CICS® キューまたはファイル。
  • DL/I データベースおよび GSAM ファイル (場合による)
  • WebSphere® MQ メッセージ・キュー (ご使用の MQ レコードで指定する場合を除く)
  • 代替 PCB に送られる出力。代替 PCB は、ターゲット・システムが IMS™ BMP または IMS/VS の場合に使用可能です。
作業論理単位 により、グループとしてコミットまたはロールバックされる入力操作が識別されます。 作業単位は、コードがリカバリー可能リソースを変更した時点で始まり、以下のいずれかのイベントが初めて発生した時点で終わります。
  • コードで sysLib.commit() または sysLib.rollback() システム関数が呼び出され、変更内容がコミットまたはロールバックされた場合。
  • コードで処理されないハード・エラーに応答して、EGL ランタイム・サービスがロールバックを実行した場合。 この場合、実行単位内のすべてのプログラムがメモリーから除去されます。
  • 暗黙的コミットが実行された場合 (以下のようなケース)。
    • 実行単位が正常に終了した場合。『実行単位』を参照してください。
    • プログラムが show 文を発行した場合。
    • プログラムが transfer to transaction 文を発行した場合。ケースごとに以下のような違いがあります。
      • CICS または IMS/VS で実行されるプログラムでは、制御権移動により常にコミットが行われます。
      • その他のプログラムでは、synchOnTrxTransfer ビルド記述子オプションの値が YES の場合にのみ、制御権移動によりコミットが行われます。
    • プログラムがセグメント化されたプログラムとして機能しているときに、テキスト UI プログラムが converse 文を発行した場合。

プログラムがトランザクション環境 (CICS、IMS、または iSeries) で実行されている場合、 EGL は、実行単位内のすべてのリソース・マネージャー間およびすべてのプログラム間で調整された 2 フェーズ・コミットを実行する環境コミットを発行します。 非トランザクション環境では、EGL は各リカバリー可能リソース・マネージャーを別々に呼び出す単一フェーズ・コミットを 実行します。

プログラムが z/OS® バッチ内で実行されて DB2® にアクセスする場合、以下のように RRSAF 環境内で実行できます。
  • この機能を有効にするには、ELACPIOP サンプル JCL を使用して ELARPIOP の新しいバージョンを作成します。ELACPIOP サンプル JCL は、IBM® Rational® COBOL Runtime for zSeries 製品のカスタマイズ中に作成される ELAJCL データ・セットです。
    次の 2 つから選択できます。
    • プログラム・ディレクトリーのセクション 6.2.1.2.2 に指定されているインストールのカスタマイズを繰り返すか、または
    • 以下に示すように、ELACPIOP JCL を変更して RRSAF=Y パラメーターを追加します。
      ELARMIOP NLS=ENU,EOF=N,SCFOLD=Y,IMSESA=N,SEGMSG=N,            X
        MSGTRN=ELAE,TRBUF=64,TSQUE=32,RRSAF=Y  
  • RRSAF の使用を有効にするには、以下のファイルを変更する必要があります。
    • プログラムをプリコンパイルするために使用する JCL または EGL ビルド・スクリプト、および
    • バッチ・ジョブを実行するために使用する実行 JCL

    さらに詳しい説明は、DB2 RRSAF の資料にあります。

  • 先述した EGL サポートは、暗黙的な RRSAF データベース接続のみが対象です。RRSAF でコードを実行する際に明示的なデータベース接続を使用する場合は、EGL プログラムを更新する必要があります。

    さらに詳しい説明は、DB2 RRSAF の資料にあります。

EGL プログラムと非 EGL プログラムの対話には、以下の考慮事項が適用されます。
  • EGL プログラムが非 EGL プログラムを呼び出し、両方のプログラムが SQL テーブルにアクセスする場合、非 EGL プログラムが コミットまたはロールバックを発生させるときは、呼び出しの前にカーソルをすべてクローズする必要があります。
  • 非トランザクション環境で、実行単位内のどの EGL プログラムも SQL を実行しないが、SQL I/O を実行する非 EGL プログラムへの呼び出しまたは制御権移動は行われるという場合、EGL は実行単位の終わりでコミットを実行しません。
sysLib.connect() または vgLib.connectionService() システム関数 (これらは他のデータベースへ動的に接続する場合に使用できます) を呼び出す場合、その前に sysLib.commit() または sysLib.rollback() を呼び出す必要があります。

互換性

表 1. 作業単位の互換性に関する考慮事項
プラットフォーム 問題
Java™ 生成
  • ハード・エラーが原因で Java プログラムが終了すると、ロールバックが実行され、カ ーソルが閉じ、ロックが解放された場合と同様の結果となる。
  • 実行単位が完了すると、EGL がコミットを実行し、カーソルを閉じ、ロックを解放する。
  • 複数のデータベースから読み込むために複数の接続を使用している場合には、作業単位で複数のデータベースを更新しないでください。これは、シングル・フェーズ・コミットのみが実行可能であるためです。詳しくは、『connect()』を参照してください。
  • ネイティブ Java と生成された Java の記述が混在しているときに、以前実行した SQL データベース変更を実行単位内でコミットする必要がある場合は、『SharedResourcePowerServer』に記載されている Java クラスを使用できます。
CICS
CICS の実行単位では、一度に 1 つの DB2 UDB データベースのみを使用できます。以下のような自動処理が実行されます。
  • ハード・エラーが原因でプログラムが終了すると、EGL ランタイム・サービスが ロールバックを実行し、カーソルを閉じ、ロックを解放する。
  • 実行単位が正常に終了すると、CICS によるコミット、カーソルの終了、ロッ クの解放が、呼び出し側で要求されない場合を除き、これらの操作が実行される。例えば、Java コードが EGL の CICS プログラムにアクセスする場合に、呼び出しに使用されているリンケージ・オプション・パーツで、その Java コードが作業論理単位を処理すると指定されている場合、これらの操作は実行されません。 この場合、その作業論理単位はクライアント作業単位 と呼ばれます。詳しくは、「EGL 生成ガイド」を参照してください。
次の場合にコミットが発生します。 これらは、DL/I 処理に関連しています。
  • DL/I にアクセスする EGL 呼び出し先プログラムのパラメーター・リストに PCB または PSB のアドレスが含まれていない場合に、その呼び出し先プログラムが呼び出し側プログラムに戻る場合。
  • 現在、PSB がスケジュールされており、EGL プログラムが transfer to program を使用して制御権を移動する場合で、以下のいずれかが当てはまる場合。
    • 制御権移動が非 EGL (および非 VisualAge Generator) プログラムに対するものである。
    • synchOnPgmTransfer ビルド記述子オプションが制御権移動元プログラムで YES に設定されている。
    • synchOnPgmTransfer ビルド記述子オプションが制御権の移動元プログラムで NO に設定されていて、移動元プログラムの PSB レコードで参照されているデフォルトの PSB が、ターゲット・プログラムの PSB レコードで参照されているデフォルトの PSB と異なっている。 (制御権移動元プログラムが CICS および IMS/VS の両方に対して生成された場合の動作の違いを最小化するには、synchOnPgmTransfer ビルド記述子オプションを NO に設定します。)
IMS BMP
sysLib.commit() は、トランザクション指向の BMP プログラムでは無視されます。 これらのプログラムでは、get next 文を使用して入出力 PCB に関連付けられたシリアル・ファイルを読み取ります。 それらのプログラムの場合は、以下の任意の状態の場合にシステムがコミットを実行します。
  • 入出力 PCB に関連付けられたシリアル・ファイルに get next 文が実行された結果、get unique (GU) 呼び出しが実行され、次のメッセージの最初のセグメントが取り出されたとき。
  • dliLib.AIBTDLI()dliLib.EGLTDLI()、または vgLib.VGTDLI() を使用して、入出力 PCB に対して CHKP 呼び出しまたは get unique(GU) 呼び出しが発行されたとき。
入出力 PCB に関連付けられたシリアル・ファイルの読み取りに get next 文を使用しないバッチ向き BMP プログラムの場合は、sysLib.commit() を呼び出すと、DL/I 基本 CHKP 呼び出しが実行されます。 この呼び出しにより、すべてのデータベースに対する変更がコミットされます。 dliLib.psbData.psbName 構造の内容が、CHKP 呼び出しでチェックポイント識別子として使用されます。

GSAM ファイルは、基本 CHKP とともに使用すると、リカバリー不可になります。 GSAM ファイルをリカバリー可能にするには、シンボリック・チェックポイントに sysLib.commit() ではなく、dliLib.AIBTDLI()dliLib.EGLTDLI()、または vgLib.VGTDLI() を使用します。

IMS/VS
sysLib.commit() は無視されます。 コミット処理は、次のような暗黙的コミット点でのみ行われます。
  • テキスト UI プログラムの場合は、各 converse 文で、または実行単位が正常に終了したとき (『実行単位』を参照)。
  • 基本プログラムの場合は、以下のような場合にシステムがコミットを実行します。
    • 入出力 PCB に関連付けられたシリアル・ファイルに get next 文が実行された結果、get unique (GU) 呼び出しが実行され、次のメッセージの最初のセグメントが取り出されたとき。
    • dliLib.AIBTDLIdliLib.EGLTDLI、または vgLib.VGTDLI を使用して、入出力 PCB に対して CHKP 呼び出しまたは get unique (GU) 呼び出しが発行されたとき。
すべてのデータベースおよびシリアル・ファイルに対する変更は、暗黙的なコミット点でコミットされます。
作業論理単位に関しては、明示的なチェックポイント・コマンド (CHXP) を実行することにより、入出力 PCB に get unique (GU) 呼び出しが実行され、コミットが実行されます。 次の点に注意してください。
  • テキスト UI プログラムでは CHKP コマンドを実行しないでください。 これは、このコマンドの実行により、生成済み COBOL プログラムの入力メッセージ・キューとの対話方法に影響が生じるためです。
  • コード内で入出力 PCB アクセスを明示的に処理している場合でも、基本プログラムでは CHKP コマンドを実行しないでください。
iSeries COBOL
暗黙的コミットは、以下の状況で発行されます。
  • 実行単位の終わりを構成するメイン・テキスト UI プログラムの終了時。 この最も一般的な例は、メイン・テキスト UI プログラムが、その開始元である非 EGL (または非 VisualAge Generator) プログラムに戻るときです。
  • プログラムが transfer to transaction 文を発行したとき。

プログラムが SQL 要求を発行した場合に sysLib.commit() を呼び出すと SQL COMMIT WORK 文が実行されます。 プログラムが SQL 要求を発行していない場合に、sysLib.commit()を呼び出した場合は、iSeries COMMIT コマンドに相当するものになります。

z/OS バッチ

プログラムが PSB は指定していないが、SQL 要求は発行した場合、sysLib.commit() を呼び出すと、SQL COMMIT WORK 文が実行されます。

プログラムで PSB を指定している場合、sysLib.commit() を呼び出すと DL/I 基本 CHKP 呼び出しが実行されます。 これにより、すべてのデータベースに対する変更がコミットされます。 dliLib.psbData.psbName 構造の内容が、CHKP 呼び出しでチェックポイント識別子として機能します。

GSAM ファイルは、基本 CHKP とともに使用すると、リカバリー不可になります。 GSAM ファイルをリカバリー可能にするには、シンボリック・チェックポイントに sysLib.commit() ではなく、dliLib.AIBTDLI()dliLib.EGLTDLI()、または vgLib.VGTDLI() を使用します。