3.14.2 ロックの設定方法

ロックは,メソッドで設定します。クラスライブラリのメソッドによるロックの設定方法には,次の4種類があります。

処理と同時にロックを設定するメソッド(~AndLockメソッド)による明示的なロックの設定
処理を実行するときに明示的にロックを設定するメソッドを使用する方法です。
これらのメソッドでは,事前にSetOIIDメソッドによって接続したオブジェクトに対して,処理と同時に指定したロックが設定できます。
SetOIIDメソッドと~AndLockメソッドを組み合わせた操作を実行することで,ConnectObjectメソッドによってロックを設定して操作するよりも,データベースへのアクセス回数が減り,高速な処理ができます。
ConnectObjectメソッドによる明示的なロックの設定
オブジェクトに接続するときに明示的にロックを設定する,ConnectObjectメソッドを使用する方法です。このメソッドでは,クラスライブラリを構成するDMAオブジェクトのうち,トップオブジェクトに当たるオブジェクトにロックを設定します。
検索実行メソッドによる明示的なロックの設定
検索を実行するメソッドによって,検索結果集合に対して明示的にロックを設定する方法です。
CdbrEqlStatement::ChangeLockTypeメソッドの引数として,ロックの種類を明示的に指定します。このメソッドで指定したロックが,CdbrEqlStatement::Executeメソッド実行時に検索結果集合に対して設定されます。
なお,この方法で明示的なロックを設定しない場合は,検索結果集合に対してロックは設定されません。暗黙に設定されるロックはありません。
それ以外のメソッドによる暗黙のロックの設定
ユーザが明示的にロックを設定するメソッドをコールしなかった場合,DocumentBrokerによってデータベースのアクセスに必要なロックを暗黙に設定させる方法です。
<この項の構成>
(1) 処理と同時にロックを設定するメソッド(~AndLockメソッド)による明示的なロックの設定
(2) ConnectObjectメソッドによる明示的なロックの設定
(3) DocumentBrokerによる暗黙のロックの設定

(1) 処理と同時にロックを設定するメソッド(~AndLockメソッド)による明示的なロックの設定

ユーザが明示的にロックを設定する場合,処理と同時にロックを設定するメソッドによって必要なロックを設定できます。このメソッドとSetOIIDメソッドを組み合わせた操作では,ConnectObjectメソッドとロックの指定をしないメソッドを組み合わせて操作する場合に比べて,高速な処理ができます。これは,データベースへのアクセス数が減るためです。

明示的なロックを設定するメソッドについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。

処理と同時にロックを設定するメソッドを使用する場合のコールシーケンスを次に示します。

処理と同時にロックを設定するメソッドを使用する例

CdbrDocument Obj;
pSession->Begin();
//ObjにOIIDを設定する
Obj.SetOIID( pSession, pOIID);
//データベースからプロパティを参照すると同時に
//WRITE_LOCKモードでロックを設定する
Obj.GetPropertyValuesAndLock( ..., DMA_LOCK_WRITE );
//プロパティを更新する
Obj.PutPropertyValues(...);
//処理の確定
pSession->Commit();

(2) ConnectObjectメソッドによる明示的なロックの設定

CdbrDMAクラスで定義されているConnectObjectメソッドによって,明示的なロックを設定することもできます。このメソッドでは,オブジェクトに接続すると同時に指定したロックが設定できます。

ConnectObjectメソッドでは,そのオブジェクトを構成するDMAオブジェクトのうち,トップオブジェクトにロックを設定します。それ以外のDMAオブジェクトについては,それぞれの参照系メソッドおよび更新系メソッドをコールするときに,必要なロックが設定されます。

なお,ConnectObjectメソッドでは,ロックの設定時にWAITモードまたはNOWAITモードの指定ができます。モードの指定については,「3.14.3 ロックが設定されているオブジェクトに対する接続」を参照してください。

また,ConnectObjectメソッドでreadロックを設定したあとでそのオブジェクトに対して更新系メソッドをコールした場合は,改めてwriteロックが設定されます。

ConnectObjectメソッドによってロックを設定する場合のコールシーケンスを次に示します。

ConnectObjectメソッドを使用する例

CdbrDocument Obj;
pSession->Begin();
//データベース中の文書オブジェクトのロックをWRITEモードで設定する
Obj.ConnectObject( pSession, DMA_LOCK_WRITE, pOIID);
//プロパティを参照する
Obj.GetPropertyValues(...);
// プロパティを更新する
Obj.PutPropertyValues(...);
Obj.ReleaseObject();
// 処理の確定
pSession->Commit();

(3) DocumentBrokerによる暗黙のロックの設定

ユーザが明示的にロックを指定しないでデータベースを直接操作するメソッドをコールした場合,DocumentBrokerによってデータベースのアクセスに必要なロックが暗黙に設定されます。

暗黙のロックは,クラスライブラリのオブジェクトを構成するDMAオブジェクトのうち,トップオブジェクトに設定されます。それ以外のオブジェクトには,メソッドの実行に必要なロックが設定されます。

DocumentBrokerの各メソッドによってトップオブジェクトに暗黙に設定されるロックについては,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。