コンテンツフレーム起動

R/3 のロックの概念 文書を SAP ライブラリストラクチャに組み込む

ロックを設定する理由

旅行代理店がフライトを予約するとします。お客様は特定の日に特定の航空会社の飛行機で特定の都市に行きたいと考えています。予約が可能なのはそのフライトにまだ空席がある場合だけです。重複予約の発生を未然に防ぐため、そのフライトに対するデータベースエントリは他のトランザクションからのアクセスに対してロックしなければなりません。そうすれば、別のトランザクションによって途中でデータが変更されるおそれがなく、1人のユーザが空席の数を確認し、ブッキングを行い、空席の数を変更することができます。

データベースシステムにおけるロックメカニズム

データベースシステムは、プログラムから変更命令( INSERT UPDATE MODIFY DELETE )を受け取ると、自動的にデータベースロックを設定します。データベースロックはこれらの命令の影響を受けるデータベースエントリに対する物理ロックです。ロックメカニズムはエントリでロックフラグを使用するため、ロックを設定できるのは既存のデータベースエントリに限ります。これらのフラグはデータベースコミットごとに自動的に削除されます。つまり、データベースロックは1つのデータベース LUW 、つまり R/3 アプリケーションプログラムでの1つのダイアログステップの範囲を超えて設定することは絶対にできません。

したがって、データベースシステムにおける物理ロックは、 R/3 トランザクションの要件には不十分です。 R/3 システムでのロックは、 SAP LUW の全期間、すなわち複数のダイアログステップにわたって設定されていなければなりません。また、ロックは異なる種のワークプロセスはもちろんのこと、異なるアプリケーションサーバからも操作できるようでなければなりません。その結果、各ロックはその R/3 システムでのすべてのサーバに適用されなければなりません。

SAP ロック

グループ化されたデータベース変更が1つのデータベース LUW で行われるという SAP LUW の概念を補うため、 R/3 システムにはデータベースロックから完全に独立したロックメカニズムも含まれています。そのため、ユーザは複数のダイアログステップにまたがるロックが設定できます。このようなロックは SAP ロックと呼ばれています。

SAP ロックの概念は ロックオブジェクトにもとづきます。ロックオブジェクトを利用することで、アプリケーションオブジェクト全体に対して SAP ロックを設定することができます。アプリケーションオブジェクトは、データベーステーブルでの1つまたは複数のエントリ、または外部キー関係を使用してリンクされる複数のデータベーステーブルエントリで構成されます。

ABAP プログラムで SAP ロックを設定するときは、その前にまず ABAP ディクショナリでロックオブジェクトを登録しなければなりません。ロックオブジェクトの定義には、ロックを設定する対象に応じたデータベーステーブルとそのキー項目が含まれます。ロックオブジェクトを登録する場合、 ENQUEUE_< ロックオブジェクト名 > DEQUEUE_< ロックオブジェクト名 > という2つの汎用モジュールが自動的に生成されます。これらの汎用モジュールを CALL FUNCTION 命令で呼び出すことにより、 ABAP プログラム内で SAP ロックの設定と解除を行うことができます。

このグラフィックは添付のテキストに説明されています

関連項目: サンプルトランザクション: SAP ロック

これらの汎用モジュールは特別なエンキュープロセスで実行されます。 R/3 システムでは、エンキュープロセスは1つのアプリケーションサーバで実行されます。このサーバは R/3 システム全体に対する中央ロックテーブルを共有メモリで更新します。

このグラフィックは添付のテキストに説明されています

エンキュー汎用モジュールは、エントリを中央ロックテーブルに書き込むことで SAP ロックを設定します。アプリケーションオブジェクト(またはその一部)がすでにロック済みであるためにロックを設定できないときは、それがリターンコード SY-SUBRC で反映されます。下図はロックに関与する R/3 システムのコンポーネントを示します。

物理ロックを設定するデータベースと異なり、 SAP ロックメカニズムは論理ロックを設定します。つまり、

ロックエントリは、単に共通の R/3 ロックテーブルにロック引数として入力されるだけです。ロック引数はロックオブジェクト内のテーブルに対する一次キー値で構成されます。これらの値はエンキュー汎用モジュールのインポートパラメータです。ロックはデータベース LUW と無関係です。ロックの解除は、データベース更新や SAP トランザクションが終了するときに暗黙的に行われるか、対応するデキュー汎用モジュールを使って明示的に行われます。更新汎用モジュールで特別なパラメータを使用して、データベース更新時にロックが解除される正確なポイントを設定することができます。

たとえば、 SAP LUW の最後の更新までデータベースに書き込まれないデータベースエントリに対する用心のためにロックを設定することができます。

データベーステーブル自体に物理ロックがないため、同じアプリケーションオブジェクトを使用するプログラムはすべて、中央テーブルでロックがないかを確認しなければなりません。プログラムがロックテーブルのロックを無視することを防ぐメカニズムはありません。

ロックタイプ

R/3 システムには2種類のロックがあります。

共有ロック(または読込ロック)により、読込中にデータが変更されることを防止することができます。他のプログラムがオブジェクトを変更するための排他ロック(書込ロック)を設定することが防止されます。ただし、他のプログラムが追加の読込ロックを設定することは妨げられません。

排他ロック(または書込ロック)により、ユーザ自身が変更中にデータが変更されることを防止することができます。排他ロックは、名前のとおり、ロックを設定するプログラムが排他使用できるようにアプリケーションオブジェクトをロックします。その場合、別のプログラムは同じアプリケーションオブジェクトに対して共有ロックや排他ロックを設定することができません。

ロック期間

ロックを設定する場合、ロックを長期間設定すると、他のトランザクションによるそのオブジェクトの使用が制限されることを念頭に置く必要があります。それでかまわないかどうかは、プログラムが実行するタスクの性格によります。

特に注意すべきことは、たいした理由もなしに設定する共有ロックがあまりに多いと、データベーステーブルを使用するプログラムに相当な影響があるということです。同時に実行されている複数のプログラムすべてがシステム内の同じアプリケーションオブジェクトに共有ロックを設定すると、排他ロックを設定することがほとんど不可能になります。なぜならば、そのロックを設定する必要があるプログラムがそのオブジェクトにロックが設定されていない時間を見つけることができないからです。逆に、排他ロックが1つあると、他のすべてのプログラムはロックされたオブジェクトを読み込むことができません。

SAP LUW の最後に、すべてのロックを解除する必要があります。これはデータベース更新時に自動的に行うか、対応するデキュー汎用モジュールを呼び出すときに明示的に行います。データベース更新とリンクされていないロックは、 SAP トランザクションの最後に解除されます。

 

 

 

コンテンツフレーム終了