3.15.10 アクセス制御と排他制御の関係

ここでは,アクセス制御と排他制御の関係について説明します。

<この項の構成>
(1) アクセス権判定時に設定されるロック
(2) アクセス制御情報の参照,更新時に設定されるロック

(1) アクセス権判定時に設定されるロック

作成したオブジェクトに対してメソッドをコールすると,DocumentBrokerではオブジェクトの操作に必要なロックを設定して処理します。アクセス制御では,まず,クラスライブラリのオブジェクトに対してロックを設定してから,ACFlag,パブリックACLおよびローカルACLを参照して,アクセス権を判定します。

ACFlagおよびローカルACLは,クラスライブラリのオブジェクトのプロパティとして設定されています。したがって,アクセス権判定でこれらを参照するとき,ACFlagおよびローカルACLには,オブジェクトに設定されているロックと同じ種類のロックが設定されます。

また,アクセス権判定でパブリックACLを参照する場合は,参照するパブリックACLにreadロックを設定します。

注意
オブジェクトの排他制御では,メソッドをコールした時点で,アクセス権判定の前にオブジェクトに対してロックが設定されます。このロックは,アクセス権がないためにメソッドがアクセスエラーになっても解除されません。アクセスエラーが発生した場合は,ロールバックをするか,トランザクションを終了してロックを解除してください。

(2) アクセス制御情報の参照,更新時に設定されるロック

GetPropertyValuesメソッドなどのプロパティを参照するメソッドによってACFlagやACLなどのアクセス制御情報を参照する場合や,PutPropertyValuesメソッドによってアクセス制御情報を更新する場合,アクセス制御情報をプロパティとして設定してあるクラスライブラリのオブジェクトに対してロックを設定します。このロックの設定方法には,次の2種類があります。

次の手順でメソッドがコールされた場合の排他制御の関係を,表3-36に示します。

  1. ユーザAがメソッドをコールしてオブジェクトのロックを設定する。
  2. 1.でユーザAがロックを設定したオブジェクトに対して,ユーザBがロックを設定するメソッドをコールする。

    表3-36 コールするメソッドの種類とアクセス制御情報の排他制御の関係


    ユーザAがコールした
    メソッドの種類
    ユーザBがコールしたメソッドの種類
    readロックを設定するメソッドwriteロックを設定するメソッドACFlagまたはローカルACLを参照するメソッドACFlagまたはローカルACLを更新するメソッドパブリックACLを参照するメソッドパブリックACLを更新するメソッドパブリックACLを削除するメソッド
    readロックを設定するメソッド×××
    writeロックを設定するメソッド×××××
    ACFlagまたはローカルACLを参照するメソッド×××
    ACFlagまたはローカルACLを更新するメソッド×××××
    パブリックACLを参照するメソッド××
    パブリックACLを更新するメソッド×××
    パブリックACLを削除するメソッド×××××××
    (凡例)
    ○:排他されます。
    ×:排他されません。
    △:アクセス権判定時にパブリックACLが参照されている場合は,排他されます。

    参考
    readロックまたはwriteロックにDBR_RLT_FOR_UPDATEを指定しても,この表で説明している排他制御の関係は変わりません。DBR_RLT_FOR_UPDATEについては,「3.14.1 ロックの概要」を参照してください。

パブリックACLに対するメソッドが排他制御されるのは,アクセス権判定のときにパブリックACLの内容が参照されている場合です。つまり,ユーザAがあるオブジェクトを参照しようとしたときに,ユーザ権限やACFlagの内容でアクセス権が確認できず,パブリックACLの内容を参照してアクセス権判定を行った場合,そのパブリックACLにはユーザAによってreadロックが設定されます。このとき,ユーザBはパブリックACLの内容を更新できません。

また,パブリックACLをユーザAが更新している場合に,パブリックACLによるアクセス権判定が必要なメソッドをユーザBがコールすることはできません。パブリックACLを削除するときには,このパブリックACLをバインドしているオブジェクトにもwriteロックが設定されます。