アナリティック・ワークスペースがマルチライタ・モードでアタッチされる場合、ACQUIREコマンドは指定されたオブジェクトを取得および再同期化(オプション)し、それらのオブジェクトの変更内容が更新およびコミットされるようにします。
構文
ACQUIRE {acquired_noresync_objects] | RESYNC [CASCADE] resync_objects [WAIT] } - [CONSISTENT WITH [CASCADE] consistency_objects [WAIT]]
ここで、resync_objectsの構文は次のとおりです。
resynch_objname [FOR DELETE | [WITH [CASCADE]|WITHOUT] RELATIONS]] , ...
引数
再同期化せずに読取り/書込みモードでアクセスする1つ以上の変数、リレーション、値セットまたはディメンション名のカンマで区切られたリスト。この方法でオブジェクトを取得すると、オブジェクトに対して行われた読取り専用の変更がすべて保存されます。この方法で取得された変数およびディメンションは、UPDATE文を使用して更新できます。
指定したオブジェクトの最新の世代を、独自に加えた変更内容をすべて廃棄して読取り/書込みモードで取得するように指定します。
読取り/書込みモードでアクセスして再同期化する変数、リレーション、値セットまたはディメンションの名前。
WAITを指定しない場合、他のユーザーがresync_objects内のオブジェクトのいずれかを読取り/書込みモードで取得していると、ACQUIRE文の実行に失敗します。WAITを指定した場合、Oracle OLAPはresync_objectsのすべてのオブジェクトが読取り/書込みモードで取得可能になるか、タイムアウトになるまで待機します。
追加のオブジェクトが読取り専用モードでアクセス可能となるように指定します。指定したオブジェクトがすでに他のユーザーにより取得されている場合のACQUIRE文の動作を指定し、ACQUIRE文の実行に成功した場合は指定したオブジェクトを再同期化します。
読取り専用モードで取得する1つ以上の変数、リレーション、値セットまたはディメンション名のカンマで区切られたリスト。
WAITを指定しない場合、consistency_objects内のオブジェクトのいずれかが読取り/書込みモードで他のユーザーにより取得されていると、ACQUIRE文の実行に失敗します。WAITキーワードを指定した場合、consistency_objectsのオブジェクトのうち、読取り/書込みモードで他のユーザーにより取得されているオブジェクトがなくなるか、タイムアウトするまでOracle OLAPがACQUIRE文の実行を待機します。
注意
一貫性の理解
CONSISTENT WITH句を含むACQUIRE文は、ある面ではACQUIRE文とRELEASE文の組合せと考えることができます。
ACQUIRE [avar...] RESYNC [rvar ...] cvar ... [WAIT] RELEASE cvar ...
違いは、ACQUIRE CONSISTENT WITH文の実行は、ユーザーにcvar
変数を取得する十分な権限がなくても成功するという点です。
障害およびエラー処理
ACQUIRE文のすべての句が成功しなければ、ACQUIRE文は失敗します。そのため、要求されたオブジェクトのすべてが取得されるか、まったく取得されないかのどちらかになります。
読取り/書込みモードでオブジェクトを取得できるのは一度に1ユーザーのみです。オブジェクトは、最初に読取り専用モードで取得した後、別のユーザーが読取り専用モードで同じオブジェクトを取得していなければ、そのオブジェクトを先に解放することなく読取り/書込みモードで取得できます。ただし、他のユーザーが読取り専用モードでオブジェクトを取得している場合、そのユーザーがオブジェクトを解放しないかぎり、同じオブジェクトを読取り/書込みモードで取得することはできません。指定したオブジェクトが他のユーザーにより取得された場合か、指定したオブジェクトの読取り専用の世代がオブジェクトの最新の世代ではない場合、ACQUIRE文が失敗します。
さらに、RESYNC句またはCONSISTENT句にWAITを指定した場合は、ACQUIRE文の完了に時間がかかることがあります。待機中、取得リストの一部の変数が、他の変数が取得されるにもかかわらず解放されることがあります。ACQUIRE文がタイムアウト・エラーを生成して失敗する原因となるデッドロックが発生する可能性もあります。
デッドロックによる問題を回避するには、ACQUIRE文およびRELEASE文をコーディングする順番に注意して、適切なエラー処理ルーチンを含めてください。
例
例9-1 オブジェクトの取得、更新および解放
マルチライタ・アタッチ・モードの従来の使用法では、2人のユーザーが同じアナリティック・ワークスペース内にある異なる2つのオブジェクトを変更できます。たとえば、アナリティック・ワークスペースに2つの変数actuals
およびbudget
があるとします。ユーザーAがactuals
を変更し、ユーザーBがbudget
を変更しようとします。この場合、アナリティック・ワークスペースをマルチライタ・モードでアタッチした後、各ユーザーは必要な変数を取得して必要な変更を行い、変更を更新およびコミットしてから、ワークスペースをデタッチするか、取得した変数を解放します。
ユーザーAは次の文を実行します。
AW ATTACH myworkspace MULTI ACQUIRE actuals ... make modifications UPDATE MULTI actuals COMMIT RELEASE actuals AW DETACH myworkspace
一方で、ユーザーBは同時に次の文を実行します。
AW ATTACH myworkspace MULTI ACQUIRE budget ... make modifications UPDATE MULTI budget COMMIT RELEASE budget AW DETACH myworkspace
例9-2 オブジェクトの取得および再同期化
B1およびB2という2人のユーザーが、どちらもbudget
のwhat-if分析で変更を行い、その結果が適切であった場合に自分の担当部分のbudget
を修正するとします。どちらのユーザーも、別のユーザーが同時にbudget
にアクセスする必要があるかどうか、またはbudget
に永続的な変更を行う必要があるかどうかがわかりません。そのため、what-if分析の変更を行う際に他のユーザーをブロックしたくないと考えます。
この場合、アナリティック・ワークスペースをマルチライタ・モードでアタッチした後、両方のユーザーがbudget
を取得せずにそれぞれのwhat-if計算を実行します。その後でwhat-if分析の変更を永続的にすることを決定したら、budgetを非同期化モードで取得します。取得に成功したら、budget
を更新して変更内容をコミットします。次のOLAP DML文は、この使用例を示しています。
AW ATTACH myworkspace MULTI ...perform what-if computations ACQUIRE budget ...maybe make some additional final changes UPDATE MULTI budget COMMIT RELEASE budget AW DETACH myworkspace
ただし、最初の取得に成功しなかった場合、ユーザーは再同期化モードで再度budget
の取得を試みます(待機を要求する場合もあります)。再同期化モードでの取得に成功した場合、変更内容を再作成し(関連する数字の一部が変更された可能性があるため)、次に各ユーザーのアナリティック・ワークスペースを更新およびコミットします。次のOLAP DML文は、この使用例を示しています。
AW ATTACH myworkspace MULTI ... perform what-if computations ACQUIRE budget ...maybe make some additional final changes UPDATE MULTI budget COMMIT RELEASE budget AW DETACH myworkspace AW ATTACH myworkspace MULTI ...perform what-if computations ACQUIRE budget --> failed ACQUIRE RESYNC budget WAIT ...determine that the changes are still needed ...make changes to make permanent UPDATE MULTI budget COMMIT RELEASE budget AW DETACH myworkspace
例9-3 一貫性を保持する場合のオブジェクトの取得
場合によっては、一部のオブジェクトの相互の一貫性を保持する必要があります。その場合、マルチライタ・モードでの特別の注意が必要となります。
ユーザーB1およびユーザーB2の2人のユーザーがどちらもbudget
を変更する必要があり、budget
はinvestment
との一貫性を保持する必要がある場合に、別のユーザー(ユーザーI)がinvestment
を変更する必要があるとします。この使用例では、どのユーザーもbudget
とinvestment
の両方を変更する必要はありませんが、すべてのユーザーは自分がbudget
またはinvestment
のどちらかを取得する際に、budgetまたはinvestmentが他のユーザーによりその時点で取得されていないことを確認する必要があります。この条件を満たすため、次のサンプル・コードに示すように、各ユーザーがCONSISTENT WITH句を含むACQUIRE文を発行する必要があります。すべてのユーザーは、CONSISTENT句にリストされているオブジェクトが、必要な場合はACQUIRE文により再同期化される場合があることを認識しておく必要があります。
たとえば、ユーザーB1は次のOLAP DML文を発行します。
AW ATTACH myworkspace MULTI ... perform what-if computations ACQUIRE budget CONSISTENT WITH investment ... maybe make some additional final changes UPDATE MULTI budget COMMIT RELEASE budget, investment AW DETACH myworkspace
ユーザーB2は、次のOLAP DML文を発行します。
AW ATTACH myworkspace MULTI ... perform what-if computations ACQUIRE budget CONSISTENT WITH investment --> failed ACQUIRE RESYNC budget CONSISTENT WITH investment WAIT ... determine that the changes are still needed ... make changes to make permanent UPDATE MULTI budget COMMIT RELEASE budget, investment AW DETACH myworkspace
AW ATTACH myworkspace MULTI ACQUIRE investment CONSISTENT WITH budget --> failed ACQUIRE RESYNC investment CONSISTENT WITH budget WAIT ... make changes to investment UPDATE MULTI investment COMMIT RELEASE budget, investment AW DETACH myworkspace