Wagbyのロックマネージャの仕組みを理解し、ロックキーをカスタマイズすることができます。(悲観ロック利用時。楽観ロックの場合は、本内容は適用されません。)

Wagby の悲観ロックでは、Wagby内部のロックマネージャを用います。ユーザーがデータの更新画面を開いたタイミングで対象データをロックします。

このとき、対象データのモデル名を「ロック名」とし、主キー項目を「ロック項目」として扱います。ロック名とロック項目の値から「ロックキー」を生成し、これをロックマネージャで管理しています。

ロックキーのカスタマイズとは、このロック名やロック項目を任意に設定できるようにすることです。 さらに、ひとつの更新画面で複数のロックキーを扱えるようにします。

この機能を利用すると、トランザクション処理のためのカスタマイズコードを記述するときに対象データのロック管理を柔軟に制御することができるようになります。

このカスタマイズは「Standard Support」の対象外となります。難易度が高いため、Wagby認定技術者の支援を受けて行うことを推奨します。

「モデル項目詳細定義>詳細>データベースの詳細>ロック名」を指定します。

図1 モデル項目詳細定義

標準は未指定(空白)となっています。対象となるモデルのすべての項目で未指定の場合は、モデル名をロック名とし、主キー項目をロックキーとします。これが通常の動作となります。

値を記載すると、この項目がロックキーとして用いられます。また記載した値がロック名となります。

次のモデルを例に示します。

モデル a

項目主キー
ida1
ida2

モデル b

項目主キー
idb1
idb2

また、モデルaおよびモデルbのデータが次のようになっているとします。

モデルaのデータ:2つのデータ

項目 ida1項目 ida2
110001001
210011002

モデルbのデータ:2つのデータ

項目 idb1項目 idb2
110001001
210011002

例1:モデル a のデータを更新する際に、モデル b のデータもロックする。

1000番のモデル a のデータを編集すると、1000番のモデル b のデータもロックする。

モデル a 項目 ida1 のモデル項目定義シートの「モデルの関連性 - ロック名」に「b」と指定します。これにより、モデル a のデータを編集する場合でも、ロック名はモデル b と同じになるため、モデル b のデータもロックされることとなります。

例2:モデル a のデータを更新する際に、ida2の値でモデル b もロックする。

1000番のモデル a のデータを編集する場合、ida2は1001なので、1001番のモデル b のデータもロックする。

モデル a 項目 ida2 のモデル項目定義シートの「モデルの関連性 - ロック名」に「b」と指定します。 この設定により、モデル a のデータを更新する場合、ロック名 b ロックキー ida2 の値となるロックを行います。

例3:下記のような複合キーのあるモデル c がある場合に、モデル a を更新する際に、ロックキーとして ida1 と ida2 を使い、モデル c をロックする。

モデル c

項目主キー
idc1
idc2

モデル a 項目 ida1 のモデル項目定義シートの「モデルの関連性 - ロック名」に「c」と指定します。

モデル a 項目 ida2 のモデル項目定義シートの「モデルの関連性 - ロック名」に「c」と指定します。

一つのモデルにて同じロック名が指定されている場合は、複合キーとして扱います。 ida1:1000,ida2:1001のモデル a のデータを更新する場合、idc1:1000,idc2:1001のモデル c のデータをロックします。

例4:モデル a を更新する際に、モデル b とモデル c のデータをロックする。

モデル a 項目 ida1 のモデル項目定義シートの「モデルの関連性 - ロック名」に「b c」と指定します。

モデル a 項目 ida2 のモデル項目定義シートの「モデルの関連性 - ロック名」に「c」と指定します。

スペース区切りで複数のロック名を指定することができます。

ida1:1000,ida2:1001のモデル a のデータを更新する場合、idb1:1000のモデル bのデータと、idc1:1000,idc2:1001のモデル c のデータをロックします。

繰り返しコンテナ内の項目を使ったロック名の指定を行うことができます。繰り返しコンテナの数に合わせて、ロックを行います。

[注意] 更新画面では繰り返しコンテナの追加/削除/挿入は行わないようにしてください。(ボタン表示制御で、SCREENTYPE 関数を利用して更新画面の場合にこれらのボタンを非表示にする、といった対応を行なってください。

一つの繰り返し項目、繰り返しコンテナ内の項目に指定した場合

この場合は、n 個のロックオブジェクトが作成されます。

例: 下記のようにcont1/c1contentにロック名が指定されたモデルがあるとします。

項目主キーロック名
id
cont1
cont1/c1id
cont1/c1contenttest1

この場合、ロック名をtest1、ロックデータキーにcont1/c1contentを用いてロックを作成します。

cont1のすべてのデータに対応するロックオブジェクトを用意します。

具体的に説明します。このモデルに対応する下記のデータがあるとします。

<test1>
  <id>1000</id>
  <cont1><c1id>1</c1id><c1content>a</c1content></cont1>
  <cont1><c1id>2</c1id><c1content>b</c1content></cont1>
</test1>

この場合、次の2つのロックオブジェクトが内部で用意されます。

ロック名:test1 ロックキー:a
ロック名:test1 ロックキー:b

一つの項目と、一つの繰り返しコンテナ内の項目に指定した場合

この場合は、n 個の複合キーとなるロックオブジェクトが作成されます。

例: 下記のようにidとcont1/c1contentにロック名が指定されたモデルがあるとします。

項目主キーロック名
idtest1
cont1
cont1/c1id
cont1/c1contenttest1

この場合、ロック名をtest1、ロックデータキーにidとcont2/c2contentを用いてロックを作成します。

通常項目と繰り返し項目等に同一のロック名を指定した場合、id項目の値と、cont2のすべての項目値を組み合わせてロックオブジェクトを用意します。

具体的に説明します。このモデルに対応する下記のデータがあるとします。

<test1>
  <id>1000</id>
  <cont1><c1id>1</c1id><c1content>a</c1content></cont1>
  <cont1><c1id>2</c1id><c1content>b</c1content></cont1>
</test1>

この場合、次の2つのロックオブジェクトが内部で用意されます。

ロック名:test1 ロックキー:1000$a
ロック名:test1 ロックキー:1000$b

複数の繰り返し項目、繰り返しコンテナ内の項目を指定した場合

この場合は、n*m 個の複合キーとなるロックオブジェクトが作成されます。

例: 下記のようにcont1/c1contentとcont2/c2content項目にロック名が指定されたモデルがあるとします。

項目主キーロック名
id
cont1
cont1/c1id
cont1/c1contenttest1
cont2
cont2/c2id
cont2/c2contenttest1

この場合、ロック名をtest1、ロックデータキーにcont1/c1contentとcont2/c2contentを用いてロックを作成します。

複数の繰り返し項目などに同一のロック名を指定した場合、cont1のすべてのデータと、cont2のすべてのデータを掛け合わせて総当たりでロックオブジェクトを用意します。

具体的に説明します。このモデルに対応する下記のデータがあるとします。

<test1>
  <id>1000</id>
  <cont1><c1id>1</c1id><c1content>a</c1content></cont1>
  <cont1><c1id>2</c1id><c1content>b</c1content></cont1>
  <cont2><c2id>1</c2id><c2content>c</c2content></cont2>
  <cont2><c2id>2</c2id><c2content>d</c2content></cont2>
</test1>

この場合、次の4つのロックオブジェクトが内部で用意されます。

ロック名:test1 ロックキー:a$c
ロック名:test1 ロックキー:a$d
ロック名:test1 ロックキー:b$c
ロック名:test1 ロックキー:b$d

  • モデル参照(チェックボックス)にロック名を指定することはできません。
  • 複数のモデルでロック名を共用する場合に、ロックキーとなる項目の型が一致する必要があります。上記、例1の設定では、モデル a 項目 ida1 とモデル b 項目 idb1 の項目の型が一致しています。
  • 複合キーとして扱われた場合は、設定されている順番と項目の型が一致する必要があります。例3の設定では、項目 ida1 と idc1、項目 ida2 と idc2 の項目の型がそれぞれ一致しています。
  • ロックキーに指定した項目は更新画面、一覧更新画面で読み込み専用項目となります。
  • ロックは更新時のみ行われます。新規登録やコピー登録の際には行われません。(*)
Wagbyは新規登録時には排他制御は行いません。カスタマイズを行う場合でも登録と更新が競合しない設計方針となるよう、留意ください。
Wagby Developer Day 2017