3.11.5 ロックに関する注意事項

ここでは,ロックに関する注意事項について説明します。

<この項の構成>
(1) ロックが設定される範囲
(2) 複数のオブジェクトにwriteロックを設定するメソッドの使用上の注意

(1) ロックが設定される範囲

Java クラスライブラリでは,メソッド実行時に,文書空間オブジェクトを構成するDMAオブジェクトのトップオブジェクトに対してロックが設定されます。また,トップオブジェクト以外のDMAオブジェクトについては,メソッドの処理に必要なオブジェクトに対してロックが設定されます。このため,次の場合,トップオブジェクト以外のDMAオブジェクトに対するロックを,ほかのユーザが取得できてしまうことがあります。

(2) 複数のオブジェクトにwriteロックを設定するメソッドの使用上の注意

複数の文書空間オブジェクトにwriteロックを設定することがあるメソッドを使用して,複数の文書空間オブジェクトを操作する場合,パラメタの指定によっては,デッドロックが発生することがあります。デッドロックの例を次の図に示します。

図3-57 デッドロックの例

[図データ]

この例では,操作対象の文書空間オブジェクトとして二つのバージョンなしフォルダ「フォルダA」と「フォルダB」があります。ユーザXが,バージョンなし文書「文書1」の作成と同時に,その文書の登録先フォルダを「フォルダA」,「フォルダB」の順に指定して,バージョンなし文書を作成するメソッド(DbjDocSpace#createDocumentメソッド)を実行したとします。このとき,ユーザYも,バージョンなし文書「文書2」の作成と同時に,その文書の登録先フォルダを「フォルダB」,「フォルダA」の順に指定して同じメソッドを実行したとします。この場合,お互いに途中で待ち状態(WAITモード)のままになってデッドロックが発生し,デッドロックが検知された時点でエラーになることがあります。

デッドロックを発生しにくくするには,次のような方法が考えられます。例えば,文書やフォルダなどの文書空間オブジェクトの一覧を取得する場合に,文書空間オブジェクトを一定の順序にソートしておいて,更新系メソッドに指定するバージョン識別子またはリンク識別子を,一定の順序で指定します。これによって,図3-57の例のような指定順が原因であるデッドロックが発生する可能性を軽減できます。