3.14.1 ロックの概要

クラスライブラリのメソッドでは,オブジェクトに接続するときに排他制御をするためのロックを設定します。ロックには,次の種類があります。

それぞれのロックによるオブジェクトの操作について説明します。

<この項の構成>
(1) ロックの種類
(2) 複数のクライアント間でのロックの関係
(3) ロックの有効期間
(4) ロックの遷移

(1) ロックの種類

(a) readロックDMA_LOCK_READ

オブジェクトを参照するときに設定するロックです。あるクライアントがreadロックを設定して取り出したオブジェクトに対して,ほかのクライアントがwriteロックを設定してオブジェクトを更新,削除することはできません。ただし,readロックを設定してオブジェクトを参照することはできます。

readロックを設定したオブジェクトの操作について次の図に示します。

図3-64 readロックを設定したオブジェクトの操作

[図データ]

クライアントAがほかのクライアントより先に文書Xにreadロックを設定して参照している場合,そのほかのクライアントは文書Xにreadロックを設定して参照することはできますが,writeロックを設定して更新および削除することはできません。

●分割取得中の検索結果のオブジェクトに対して更新または削除処理を行う場合(DMA_LOCK_READ | DBR_RLT_FOR_UPDATE
このロック種別(DMA_LOCK_READ | DBR_RLT_FOR_UPDATE)を指定すると,対象オブジェクトにはreadロックが設定されて,分割取得中の検索結果のオブジェクトに対して更新または削除処理が実行できます。
このロック種別は次に示すメソッドで指定できます。
  • GetVersionListAndLock
  • GetVersionableListAndLock
  • GetContainableListAndLock
  • GetContainerListAndLock
  • GetVTContaineeListAndLock
(b) writeロックDMA_LOCK_WRITE

オブジェクトを更新または削除する場合に設定するロックです。あるクライアントがwriteロックを設定して取り出したオブジェクトに対して,ほかのクライアントはreadロックまたはwriteロックを設定できません。したがって,writeロックを設定した以外のクライアントが,readロックまたはwriteロックを設定してオブジェクトを参照,更新または削除することはできません。

writeロックを設定したオブジェクトの操作について,次の図に示します。

図3-65 writeロックを設定したオブジェクトの操作

[図データ]

クライアントAがほかのクライアントより先に文書Xにwriteロックを設定して更新または削除しようとしている場合,そのほかのクライアントは文書Xにreadロックを設定して参照したり,writeロックを設定して更新および削除することはできません。

●分割取得中の検索結果のオブジェクトに対して更新または削除処理を行う場合(DMA_LOCK_WRITE | DBR_RLT_FOR_UPDATE
このロック種別(DMA_LOCK_WRITE | DBR_RLT_FOR_UPDATE)を指定すると,対象オブジェクトにはwriteロックが設定されて,分割取得中の検索結果のオブジェクトに対して更新または削除処理が実行できます。
このロック種別は次に示すメソッドで指定できます。
  • GetVersionListAndLock
  • GetVersionableListAndLock
  • GetContainableListAndLock
  • GetContainerListAndLock
  • GetVTContaineeListAndLock

(2) 複数のクライアント間でのロックの関係

次の表に,複数のクライアント間でのロックの関係について示します。ここでは,クライアントAがオブジェクトにロックを設定している状態でほかのクライアントから設定できるロックの種類を示します。

表3-11 複数のクライアント間でのロックの関係

クライアントAが設定したロックreadwrite
ほかのクライアントが設定するロックread×
write××
(凡例)
○:ロックを設定できます。
×:ロックを設定できません。

(3) ロックの有効期間

ロックは,次の時点まで継続します。

(4) ロックの遷移

同一トランザクション内でのロックの遷移について説明します。ユーザが同一トランザクション内で一つのオブジェクトに異なる種類のロックを設定するメソッドを発行した場合,オブジェクトに設定されるロックは次の表に示すように遷移します。

表3-12 同一トランザクション内でのロックの遷移

設定済みのロックreadwrite
新たに設定しようとしたロックreadreadのままwriteのまま
writewriteに遷移writeのまま

このように,すでにロックを設定しているオブジェクトに対して異なる種類のロックを設定しようとした場合は,強い種類のロックに変更しようとした場合だけ,ロックの種類が遷移します。