3.14.4 ロックの範囲

ここでは,メソッドによって設定されるロックの範囲について説明します。ロックは,クラスライブラリのオブジェクトを構成するDMAオブジェクトのうち,トップオブジェクトとメソッドの処理に必要なオブジェクトに対して設定されます。

まず,メソッドごとのロックの範囲について例を示します。続いて,複数のバージョンを持っているオブジェクトに設定されるロックの範囲について説明します。

ここでは,CdbrDocumentオブジェクトおよびCdbrVersionableDocumentオブジェクトを例として説明します。

<この項の構成>
(1) 処理と同時にロックを設定するメソッド(~AndLockメソッド)によって設定されるロックの範囲
(2) ConnectObjectメソッドによって設定されるロックの範囲
(3) 暗黙のロックを設定するメソッドによって設定されるロックの範囲
(4) 複数のバージョンを持つオブジェクトに設定されるロックの範囲
(5) プロパティの取得によって設定されるロックの範囲
(6) バージョン一覧の取得によって設定されるロックの範囲
(7) チェックイン,チェックアウトによって設定されるロックの範囲
(8) 検索結果に設定されるロック
(9) マルチレンディション文書に設定されるロック

(1) 処理と同時にロックを設定するメソッド(~AndLockメソッド)によって設定されるロックの範囲

処理と同時にロックを設定するメソッドでは,DMAオブジェクトのうち,トップオブジェクトと処理に必要なオブジェクトに対してロックを設定します。

例として,CdbrDocument::GetContentAndLockメソッドによって設定されるロックの範囲について次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。

図3-66 CdbrDocument::GetContentAndLockメソッドによって設定されるロックの範囲

[図データ]

(2) ConnectObjectメソッドによって設定されるロックの範囲

ConnectObjectメソッドでは,トップオブジェクトにだけロックを設定します。

例として,CdbrDocument::ConnectObjectメソッドによって設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。

図3-67 CdbrDocument::ConnectObjectメソッドによって設定されるロックの範囲

[図データ]

このメソッドによってオブジェクトに接続した場合は,以降のロックを必要とする操作(GetContentメソッドなど)を実行するときには,再びデータベースにアクセスして,操作に関係するオブジェクトに対して必要なロックを設定することになります。

(3) 暗黙のロックを設定するメソッドによって設定されるロックの範囲

ユーザが明示的にロックを指定しないでデータベースを直接操作するメソッドをコールした場合には,DocumentBrokerによって最低限必要なロックが暗黙に設定されます。例えば,CdbrDocument::GetContentメソッドをロックの指定なしにコールした場合,必要なオブジェクトに対してreadロックが設定されます。

CdbrDocument::GetContentメソッドによって設定されるロックの範囲を次の図に示します。

図3-68 CdbrDocument::GetContentメソッドによって設定されるロックの範囲

[図データ]

(4) 複数のバージョンを持つオブジェクトに設定されるロックの範囲

複数のバージョンを持つオブジェクトに設定されるロックの範囲について説明します。バージョン管理についての詳細は,「3.3 文書のバージョン管理」を参照してください。

複数のバージョンを持っているオブジェクトに対してメソッドをコールした場合,引数で指定したバージョンに対応するDMAオブジェクトにだけロックを設定します。

例えば複数のバージョンを持つCdbrVersionableDocumentオブジェクトに対して,引数にカレントバージョンのバージョン識別子を指定してCdbrVersionableDocument::GetContentAndLockメソッドをコールした場合,次の図に示す範囲に,ロックが設定されます。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。

図3-69 CdbrVersionableDocument::GetContentAndLockメソッドによって設定されるロックの範囲

[図データ]

(5) プロパティの取得によって設定されるロックの範囲

プロパティの取得には,CdbrDMAクラスで定義されているGetPropertyValuesメソッドまたはGetPropertyValuesAndLockメソッドを使用します。このメソッドをコールすると,トップオブジェクトのほか,複数のバージョンを持つ文書やコンテナの場合は幾つのバージョンを持っているかを示すDMAオブジェクトおよび文書やコンテナを表すDMAオブジェクトにもロックが設定されます。

CdbrVersionableDocumentオブジェクトに対して,CdbrVersionableDocument::GetPropertyValuesAndLockメソッドをコールした場合に設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。

図3-70 CdbrVersionableDocument::GetPropertyValuesAndLockメソッドによって設定されるロックの範囲

[図データ]

(6) バージョン一覧の取得によって設定されるロックの範囲

バージョン一覧の取得には,CdbrVersionableクラスで定義されているGetVersionListメソッドまたはGetVersionListAndLockメソッドを使用します。このメソッドをコールした場合,トップオブジェクトのほか,幾つのバージョンを持っているかを示すDMAオブジェクトにもロックを設定します。

例えばCdbrVersionableDocumentオブジェクトの場合は,ConfigurationHistoryオブジェクトのほか,VersionSeriesオブジェクトに対してもロックを設定します。

CdbrVersionableDocument::GetVersionListAndLockメソッドによって設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。

図3-71 CdbrVersionableDocument::GetVersionListAndLockメソッドによって設定されるロックの範囲

[図データ]

(7) チェックイン,チェックアウトによって設定されるロックの範囲

文書などをバージョンアップするためにチェックイン,チェックアウトをするには,CdbrVersionableクラスなどで定義されているVersionCheckOutメソッドおよびVersionCheckInメソッドを使用します。これらのメソッドをコールする場合は,バージョンアップする基になるバージョンと,新しく作成するバージョン文書などを構成するDMAオブジェクトに対してロックを設定します。

例えば,CdbrVersionableDocument::VersionCheckOutメソッドおよびCdbrVersionableDocument::VersionCheckInメソッドによって文書をバージョンアップする場合は,次の図に示す範囲に,ロックが設定されます。

図3-72 CdbrVersionableDocument::VersionCheckOutメソッドおよびCdbrVersionableDocument::VersionCheckInメソッドによって設定されるロックの範囲

[図データ]

(8) 検索結果に設定されるロック

オブジェクトの検索を実行した時に,検索結果であるオブジェクトにロックを設定しないと,検索結果を取得する前にデータベースの内容が更新され,正しい検索結果を取得できない可能性があります。

検索結果に設定するロックは,次のメソッドで設定します。

ただし,検索結果にロックを設定する場合,処理はロックを設定しない場合に比べて検索処理が遅くなります。必要に応じて使い分けてください。

(9) マルチレンディション文書に設定されるロック

マルチレンディション管理をしている文書を操作する場合,ロックは,マルチレンディション文書に対応するCdbrVersionableDocumentオブジェクトおよびCdbrDocumentオブジェクトを構成するDMAオブジェクトのうち,操作に必要なDMAオブジェクトに対して設定されます。