第10章  コミットメントサイクル
RPGプログラマーの為のC言語講座
トランザクション処理というとSQLが代表的ですが、ここでは、まず、 OS/400が基本機能として持っているトランザクション処理について説明し、 従来のRPGがどのようにして動作するかを確認した後に、SQLの説明に入りたいと思います。 ところで、トランザクション処理とはどんな処理をいうのでしょうか? もちろん、きちんとした定義はありますが、あえて誤解をおそれず簡単にいってしまうと

データベースへの一連の更新が、全てOKか、全てダメか、どちらかしかないようにする処理

という事になるでしょう。

【データベースとは】

AS/400のユーザーは、データベースという意味を、しばしば、物理ファイル,論理ファイルを指して 使用されているようです。
おそらく、AS/400はDB2/400をOSの中に組み込んでいるため、 ( DB2/400 という言い方もあとからついた名称で、当初はRDBに名前すら付いていませんでした) ユーザーがDBMSの存在をほとんど意識しないでRDBを使用出来ることに起因するのでしょう。
OS/400のIPLが終われば、なんにもしないでいきなりファイル(テーブル)を作成できるのですから すごいことですよね。

他の DBMS はインストール/構成と言った作業が必要なので、嫌でも DBMS 自体の管理が必要になります。
という訳で、世間一般では、データベースというと、DBMSを指していることが多いでしょう。

【一連の更新とは】

対象となる更新には、
  • 複数のファイルに対して行う更新、
  • 同じファイル(テーブル)に対して行う、複数回の更新(READ/WRITE/UPDATE/DELETE)
などが考えられます。

プログラム(JOB)行う上記の更新は、複数の READ/WRITE/UPDATE/DELTE がある同じパターンで繰り返されるはずです。
たとえば、販売システムなどで
「商品マスターをCHAINして整合性チェックしたあとに、売上ファイルに明細をWRITEして、在庫数量をUPDATEして、 得意先の売掛金をUPDATEする」
といった一連の処理は、PGMは分割されるかもしれませんが、売上計上処理毎には同じパターンの繰り返しになるはずです。

この一連の繰り返しの範囲で、全てをOKとするか (COMMIT)全てをダメにするか(ROLLBACK)どちらかしかない 処理が、トランザクション処理と言えるでしょう。(勝手な独断?)

【コミットメントサイクル】

前置きが長くなってしまいましたが、「データベースへの一連の更新」をトランザクション(または作業単位)といいます。

トランザクションを、「全てOK」にすることが COMMIT で、 「全てダメ」にすることがROLLBACKです。
また、COMMIT/ROLLBACKから次のCOMMIT/ROLLBACKまでをコミットメントサイクルといいます。

コミットメントサイクルで、COMMIT/ROLLBACKの制御を行うことを、コミットメントコントロールといいます。

【AS/400でのコミットメントコントロール】

SQL以外のプログラムは、JOBの中でSTRCMTCTLコマンドを発行して、コミットメント制御を開始します。
STRCMTCTLコマンドのパラメーターの詳細はマニュアルまたはヘルプを参照して下さい。

ここでは、実際のコミットメント制御の動作にかかわるLCKLVLとCMTSCOPEを説明します。

マニュアルより抜粋

LCKLVL
    開始されるコミットメント定義の際に起こるレコード・ロックの省略時レベル
    を指定します。
 
    *CHG:  更新のために読み込まれたすべてのレコード (コミットメント制御下
    でオープンされたファイル) がロックされます。更新、追加、または削除され
    たレコードは、変換がコミットされるか、あるいはロールバックされるまでロ
    ックされたままです。更新の目的でアクセスされ、更新されずに解放されたレ
    コードはアンロックされます。
 
    *CS:  コミットメント制御下でオープンされたファイルに対してアクセスする
    すべてのレコードがロックされます。更新または削除されないレコードは、別
    のレコードがアクセスされるまでの間だけロックされます。更新、追加、また
    は削除されるレコードは、トランザクションのコミットまたはロール・バック
    が終るまではロックされます。
 
    *ALL:  コミットメント制御下でオープンされたファイルに対してアクセスす
    るすべてのレコードは、そのトランザクションがコミットされるかまたはロー
    ルバックされるまでロックされます。

CMTSCOPE
    開始するコミットメント定義の範囲を指定します。
 
    *ACTGRP:  活性化グループ・レベル・コミットメント定義が、コマンドを出す
    プログラムに関連付けられる活性化グループに対して開始されます。
 
    *JOB:  ジョブ・レベル・コミットメント定義が、ジョブに対して開始されま
    す。

【関連コマンド】

コミットメント制御
  • STRCMTCTL コミットメント制御開始
  • ENDCMTCTL コミットメント制御終了
  • WRKCMTDFN コミットメント定義処理
ジャーナル関連
  • CRTJRNRCV ジャーナルレシーバーの作成
  • CRTJRN  ジャーナルの作成 
  • STRJRNPF 物理ファイルにジャーナル開始
コミット/ロールバック
  • COMMIT/ROLLBACK CLコマンド
  • COMMIT/ROOLBACK SQLコマンド
  • COMIT/ROLBK RPGコマンド(F仕様書にKCOMITが必要)