ここでは,メソッドによって設定されるロックの範囲について説明します。ロックは,クラスライブラリのオブジェクトを構成するDMAオブジェクトのうち,トップオブジェクトとメソッドの処理に必要なオブジェクトに対して設定されます。
まず,メソッドごとのロックの範囲について例を示します。続いて,複数のバージョンを持っているオブジェクトに設定されるロックの範囲について説明します。
ここでは,CdbrDocumentオブジェクトおよびCdbrVersionableDocumentオブジェクトを例として説明します。
処理と同時にロックを設定するメソッドでは,DMAオブジェクトのうち,トップオブジェクトと処理に必要なオブジェクトに対してロックを設定します。
例として,CdbrDocument::GetContentAndLockメソッドによって設定されるロックの範囲について次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。
図3-66 CdbrDocument::GetContentAndLockメソッドによって設定されるロックの範囲
ConnectObjectメソッドでは,トップオブジェクトにだけロックを設定します。
例として,CdbrDocument::ConnectObjectメソッドによって設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。
図3-67 CdbrDocument::ConnectObjectメソッドによって設定されるロックの範囲
このメソッドによってオブジェクトに接続した場合は,以降のロックを必要とする操作(GetContentメソッドなど)を実行するときには,再びデータベースにアクセスして,操作に関係するオブジェクトに対して必要なロックを設定することになります。
ユーザが明示的にロックを指定しないでデータベースを直接操作するメソッドをコールした場合には,DocumentBrokerによって最低限必要なロックが暗黙に設定されます。例えば,CdbrDocument::GetContentメソッドをロックの指定なしにコールした場合,必要なオブジェクトに対してreadロックが設定されます。
CdbrDocument::GetContentメソッドによって設定されるロックの範囲を次の図に示します。
図3-68 CdbrDocument::GetContentメソッドによって設定されるロックの範囲
複数のバージョンを持つオブジェクトに設定されるロックの範囲について説明します。バージョン管理についての詳細は,「3.3 文書のバージョン管理」を参照してください。
複数のバージョンを持っているオブジェクトに対してメソッドをコールした場合,引数で指定したバージョンに対応するDMAオブジェクトにだけロックを設定します。
例えば複数のバージョンを持つCdbrVersionableDocumentオブジェクトに対して,引数にカレントバージョンのバージョン識別子を指定してCdbrVersionableDocument::GetContentAndLockメソッドをコールした場合,次の図に示す範囲に,ロックが設定されます。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。
図3-69 CdbrVersionableDocument::GetContentAndLockメソッドによって設定されるロックの範囲
プロパティの取得には,CdbrDMAクラスで定義されているGetPropertyValuesメソッドまたはGetPropertyValuesAndLockメソッドを使用します。このメソッドをコールすると,トップオブジェクトのほか,複数のバージョンを持つ文書やコンテナの場合は幾つのバージョンを持っているかを示すDMAオブジェクトおよび文書やコンテナを表すDMAオブジェクトにもロックが設定されます。
CdbrVersionableDocumentオブジェクトに対して,CdbrVersionableDocument::GetPropertyValuesAndLockメソッドをコールした場合に設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。
図3-70 CdbrVersionableDocument::GetPropertyValuesAndLockメソッドによって設定されるロックの範囲
バージョン一覧の取得には,CdbrVersionableクラスで定義されているGetVersionListメソッドまたはGetVersionListAndLockメソッドを使用します。このメソッドをコールした場合,トップオブジェクトのほか,幾つのバージョンを持っているかを示すDMAオブジェクトにもロックを設定します。
例えばCdbrVersionableDocumentオブジェクトの場合は,ConfigurationHistoryオブジェクトのほか,VersionSeriesオブジェクトに対してもロックを設定します。
CdbrVersionableDocument::GetVersionListAndLockメソッドによって設定されるロックの範囲を次の図に示します。なお,このときメソッドの引数にDMA_LOCK_WRITEを指定して,writeロックを設定することにします。
図3-71 CdbrVersionableDocument::GetVersionListAndLockメソッドによって設定されるロックの範囲
文書などをバージョンアップするためにチェックイン,チェックアウトをするには,CdbrVersionableクラスなどで定義されているVersionCheckOutメソッドおよびVersionCheckInメソッドを使用します。これらのメソッドをコールする場合は,バージョンアップする基になるバージョンと,新しく作成するバージョン文書などを構成するDMAオブジェクトに対してロックを設定します。
例えば,CdbrVersionableDocument::VersionCheckOutメソッドおよびCdbrVersionableDocument::VersionCheckInメソッドによって文書をバージョンアップする場合は,次の図に示す範囲に,ロックが設定されます。
図3-72 CdbrVersionableDocument::VersionCheckOutメソッドおよびCdbrVersionableDocument::VersionCheckInメソッドによって設定されるロックの範囲
オブジェクトの検索を実行した時に,検索結果であるオブジェクトにロックを設定しないと,検索結果を取得する前にデータベースの内容が更新され,正しい検索結果を取得できない可能性があります。
検索結果に設定するロックは,次のメソッドで設定します。
ただし,検索結果にロックを設定する場合,処理はロックを設定しない場合に比べて検索処理が遅くなります。必要に応じて使い分けてください。
マルチレンディション管理をしている文書を操作する場合,ロックは,マルチレンディション文書に対応するCdbrVersionableDocumentオブジェクトおよびCdbrDocumentオブジェクトを構成するDMAオブジェクトのうち,操作に必要なDMAオブジェクトに対して設定されます。