排他制御

21.3 排他制御

3. 排他制御

  • 排他制御
  • 3つのロックモード

排他制御

排他制御とは、あるデータベーステーブル上の情報を更新するときに、ほかのプログラムで更新させないようにする処理のことを指します。
一般的に物理ロックと論理ロックの2種類が存在しますが、ABAPでは、基本的に論理ロックが用いられます。「このテーブルを、この条件でロックしています」という情報を、メモリ上に保持することで、排他を実現しています。

各プログラムは、テーブルを更新しようとするたびに、この情報を参照して、ほかのプログラムにロックされていないかどうかを判断します。
ABAPでの排他処理を行うには、登録されたロックオブジェクトの汎用モジュールを、コールして実施します

3つのロックモード

ロックモードは、下の表に示した3種類があります。

何が違うのかというと、ロックモードごとに、ロックエラーになる場合とならない場合が異なります

表にすると以下の表のようになります。OKはロックエラーになる場合、NGはロックエラーにならない場合です。

ロックオブジェクトの登録方法

1.トランザクションコード:SE11からロックオブジェクト名を入力
 ※「E」始まりで命名する。

2.各項目を入力

入力内容
内容説明 :ロックオブジェクトの名称を入力
名称    :ロック対象のテーブルIDを入力
ロックモード :E(書込ロック)を選択

3. ロックパラメータにロック対象テーブルのキー項目が設定されていることを確認

4.保存し、有効化

5. ジャンプ>ロックモジュール からロックモジュール名を確認

6. トランザクションコード:SE37からロックモジュールが自動生成されていることを確認

※SAPの場合は、ロック処理は必ずロック用の汎用モジュールにより実施します。ロック/アンロック用汎用モジュールはロックオブジェクトの作成により自動作成されるものとなりますので、もし上記のようなテーブルアクセスを行う場合は、ロックオブジェクト作成が必要となりますが、特にそのような処理が不要であれば、全てのテーブルにロックオブジェクトを作成する必要はございません。

ロック処理実装例

REPORT YR2004001_LK_KANDA.
* ロック処理
  CALL FUNCTION 'ENQUEUE_EZT200400101'
    EXPORTING
      MODE_ZT200400101     = 'E'
      MANDT                = SY-MANDT
      MATNR                = 'MA001'
    EXCEPTIONS
      FOREIGN_LOCK         = 1
      SYSTEM_FAILURE       = 2
    OTHERS                 = 3
            .
  IF SY-SUBRC <> 0.
*   ロック失敗
  ENDIF.

* ロック解除処理
  CALL FUNCTION 'DEQUEUE_EZT200400101'
   EXPORTING
     MODE_ZT200400101       = 'E'
     MANDT                  = SY-MANDT
     MATNR                  = 'MA001'.

補足

① MODE_ZT200400101と、MANDTのパラメータの値は、
汎用モジュールのデフォルト値を設定されている?

→汎用モジュールのデフォルト値を指定しています。
MODEは指定したいロックモード(特に指示がなければ’E’を使用)
MANDTにはシステム変数のクライアントを指定しています。

② MATNRパラメータの値 ‘MA001’は、どのように設定しているでしょうか?
(ロックモジュールでは、デフォルト値はブランクになっている。)

上記サンプルプログラムでは、ZT200400201に登録されている品目:MA001に
処理を行う際の排他制御を想定しています。
処理を行いたいデータに対してキーを指定してロックをかけることで、
そのテーブルの指定した品目(MA001)に対しては、
1人のユーザーしか登録、更新、削除をかけられなくなります。

ロック用汎用モジュールはパラメータを指定するほど限定的にロックを行います。
MATNRにパラメータを記載することで、クライアント単位に加えて
そこに指定した品目コード単位でロックをかけられます。
品目コード単位でもロックすることで、例えば同じクライアントのユーザーが
同時に処理を行っても、違う品目コードであればロックエラーとなりません。
整理すると、
・クライアントのみを指定:同じクライアントのユーザーすべてに対してロックを行う →対象テーブルのいずれの品目でも処理をかけようとしたらロックエラー
・クライアントと品目コードを指定:同じクライアントのユーザーかつ、指定した品目コードにのみロックを行う
→複数のユーザーが利用できるが、同じ品目コード(ロックされているもの)を処理しようとするとロックエラー

ENQUEUE_EZT200400201

DEQUEUE_EZT200400201

上記の内容は、SE11でロックオブジェクトを作成したら、自動で生成されるのか?
⇒ロック/アンロック用汎用モジュールのパラメータは
 ロックオブジェクト作成時に自動生成されます。
 なお対象テーブルのキーの数に応じてパラメータ数が変わります。

・自動で生成される場合、作成されるタイミングはいつ?
 ⇒ロックオブジェクトを有効化した段階で作成される。

ロックされているかどうかの確認方法

1. トランザクションコード:SM12
対象のテーブル名等を入力し、一覧を押下

2. レコードありの場合
下記のように品目コード:MA001のレコードがロックされている

3.レコードなしの場合
下記のようにロック解除されている

補足(排他制御用の汎用モジュールについて)

排他制御用の汎用モジュールは、その特性上標準ともアドオンとも言えない汎用モジュールとなります。
そもそもがロック/アンロックの汎用モジュールはSE11から対象テーブルのロックオブジェクトを作成することで、共に自動作成されます。

自動作成のため名称も勝手に決まりますが、この際必ず以下パターンで命名されます。

・ロック用:ENQUEUE_E<対象テーブル名>

・アンロック用:DEQUEUE_E<対象テーブル名>

テーブルに排他制御を行いたい(ロック用の汎用モジュールを作りたい)場合は、必ず対象テーブルのロックオブジェクトを作って、排他制御用の汎用モジュールを自動作成させる必要があります。


NEXT>> 第22章 モージュル化