1.3 Workspace Managerでのロック管理
通常のOracle AI Databaseトランザクションが提供するロックの他に、Workspace Managerは2種類のバージョン・ロックを提供します。このロックの主な目的は、親作業領域と子作業領域の間における行の競合を排除することにある。ロックは、作業領域、セッションまたは指定行に対して、あるいはそれらを組み合せて使用可能にできます。
-
データ変更が1つまたは少数の作業領域内で行われている場合、または作業領域内のすべてのデータ変更をロックする場合は、作業領域レベルでロックします(SetWorkspaceLockModeONプロシージャ)。
-
データ変更が多数の作業領域内で行われている場合は、セッション・レベルでロックします(SetLockingONプロシージャ)。セッションに対してロックを使用可能にすると、Workspace Managerはこのセッションが存在するすべての作業領域の行をロックします。
-
行が更新される前に行をロックするか、または行が挿入された後(または、更新後に
WHERE句を満たす場合は、更新された後)に行を自動的にロックする場合は、特定の行をロックします(LockRowsプロシージャ)。
作業領域およびセッションのロックは、作業領域またはセッションの存続期間中、あるいは作業領域がマージまたはロールバックされるまで持続します。
データベースのロックと同様に、Workspace Managerのロックには排他ロックまたは共有ロックがあります。
-
排他ロック: このロックは、データベース・トランザクションのロックに非常に類似しています。レコードが排他ロックされると、レコードをロックしたセッション(ユーザー)以外のデータベース内のユーザーは、そのレコードを変更できません。排他的ロックがユーザーに対して有効になっている場合、そのユーザーが変更を行ったすべての行が排他的にロックされます。また、その行の親である行も排他的にロックされます。このため、排他ロック操作を使用すると、子作業領域と親作業領域の間におけるデータの競合を排除できます(ただし、排他ロックと行バージョンの詳細と、更新操作における排他ロックのタイミングが、他ユーザーが行を更新できるかどうかにどのように影響するかの詳細は、「排他ロックと行バージョン」を参照してください。)
-
共有ロック - 行が一度共有ロックされると、行がロックされている作業領域のユーザーのみがその行を変更できます。その行の親バージョンも共有ロックされるため、その行は競合から保護されます。排他ロックにない共有ロックのメリットは、行がロックされている作業領域内のすべてのユーザーがその行にアクセスし、行を変更できることです。この種類のロックは、親である行との競合を避ける必要があり、グループ・プロジェクトのメンバーである複数のユーザーが変更する必要がある行に使用することが理想的です。共有ロック操作は、作業領域内の各セッションに対して個々に使用可能にする必要があることに注意してください。
作業領域排他ロックとバージョン排他ロックは、ユーザーがデータ値を変更できるかどうかを制御する排他ロックの一種ですが、排他ロックとは異なり、競合の発生は回避されません。作業領域排他ロックは、ロックを設定したユーザーのみが現行の作業領域内で値を変更できるように行をロックします。ただし、他の作業領域の他のユーザーは値を変更できます。バージョン排他ロックは、ロックを設定したユーザーのみが値を変更できる(またそのユーザーがどの作業領域でも操作できる)ように行をロックします。どの作業領域でも他のユーザーは値を変更できません。
次の表に、特定の作業領域内で特定のユーザーがロックした行を、どの作業領域のどのユーザーが変更できるかを示します。たとえば、この表の最初の2つの項目は、行が共有(S)ロックされていると、その行がロックされた作業領域のユーザーはだれでもその行を変更できますが、他の作業領域内のユーザーはその行を変更できないことを意味します。
表1-3 Workspace Managerのロック・モードとデータ変更の可否
| ロック・モード | ユーザー | ユーザーの作業領域 | 変更可能/不可 |
|---|---|---|---|
|
共有(S) |
すべてのユーザー |
行がロックされた作業領域 |
可能 |
|
共有(S) |
すべてのユーザー |
行がロックされたのとは異なる作業領域 |
不可 |
|
排他(E) |
行をロックしたユーザー |
行がロックされた作業領域 |
可能 |
|
排他(E) |
行をロックしたユーザー |
行がロックされたのとは異なる作業領域 |
不可 |
|
排他(E) |
行をロックしたのとは異なるユーザー |
すべての作業領域 |
不可 |
|
作業領域排他(WE) |
行をロックしたユーザー |
すべての作業領域 |
可能 |
|
作業領域排他(WE) |
行をロックしたのとは異なるユーザー |
行がロックされたのとは異なる作業領域 |
可能 |
|
作業領域排他(WE) |
行をロックしたのとは異なるユーザー |
行がロックされた作業領域 |
不可 |
|
バージョン排他(VE) |
行をロックしたユーザー |
すべての作業領域 |
可能 |
|
バージョン排他(VE) |
行をロックしたのとは異なるユーザー |
すべての作業領域 |
不可 |
行をロックすることは、作業領域のマージ操作、リフレッシュ操作およびロールバック操作には影響しませんが、これらの操作後、その行で何ができるかに影響します。これらの作業領域操作を実行する前に、作業領域権限を使用して、FreezeWorkspaceプロシージャをコールし、作業領域xxx_LOCKビュー(「xxx_LOCKビュー」を参照)を確認することにより、操作を制御できます。
xxx_LOCK静的データ・ディクショナリ・ビュー(「xxx_LOCKビュー」を参照)には、各バージョン対応表のロックに関する情報が含まれています。
参照整合性制約を持つ表に対するDML操作でのWorkspace Managerロック操作の詳細は、「参照整合性制約を持つ表のDML操作でのロック」を参照してください。
1.3.1 排他ロックと行バージョン
子作業領域内での更新操作に対する排他ロックのタイミングは、親作業領域内で、どの行のどのバージョン(バージョンがある場合)を更新できるかに影響します。たとえば、表がLIVE作業領域内でバージョン対応している場合、元の各行はバージョン0に割り当てられます。LIVE作業領域の子としてW1の名前の作業領域が作成されると想定します。作業領域W1の作成時、次の動作が発生します。
-
バージョン1は
LIVE作業領域に割り当てられる(ただし、追加の行は作成されない)。 -
バージョン2は作業領域
W1に割り当てられる(ただし、追加の行は作成されない)。作業領域W1内の問合せは、引き続きLIVE作業領域内にある行のバージョン0に戻されます。
この例を使用すると、作業領域W1内のユーザーが、更新される前の行に排他ロックをかけた場合、作業領域W1内のこのユーザーのみが行を更新できます。具体的には、次のようになります:
-
その行のバージョン0がロックされ、ロックが解除されるまで、他作業領域からその行へのすべての更新を排除します。
-
バージョン0は作業領域
W1の現在の物理行であるため、作業領域W1(またはW1の子孫作業領域)からロックをかけることができます。 -
作業領域
W1のユーザーがこの行を更新すると、作業領域W1およびそのすべての子作業領域からのみ参照できる新しい行(バージョン2)が作成されます。
ただし、この行がLIVE作業領域内でロックされていない場合は、作業領域W1内のユーザーが行を更新した後でこの行に排他ロックをかけると、LIVE作業領域内のユーザーはこの行を更新できます。具体的には、次のようになります:
-
作業領域
W1およびそのすべての子作業領域からのみ参照できる新しい行(バージョン2)が作成されます。 -
バージョン2の行がロックされます。ロックをかけたユーザー以外の作業領域
W1内のユーザー、または作業領域W1のすべての子作業領域内のユーザーは、行を更新したり、行の新しいバージョンを作成したりできません。 -
LIVE作業領域の行のバージョン0はロックされていません。LIVE作業領域内またはW1の兄弟作業領域内のユーザーが行を更新した場合、行の新しいバージョン(バージョン1)が作成されます。(バージョン0は、すでに作業領域W1内のユーザーにとって行の現行バージョンではないため、ロックされません。かわってバージョン2がその作業領域内の行の現行バージョンになっています。)
つまり、更新後の排他ロックは、作業領域ツリー内のロックされた作業領域の上位にある作業領域内の行、または作業領域ツリーの他ブランチ内の作業領域内の行の以前のバージョンをロックしません。
親トピック: Workspace Managerでのロック管理
1.3.2 Workspace Managerの操作に適用されるロック
Workspace Managerは、DBMS_WMサブプログラムに関連する特定の操作を実行するときに、自動的にロックを適用します。Workspace Managerは次の内容をチェックします:
-
必要なロックを正常に要求できるかどうか
-
作業領域が、要求された操作との互換性がないモードにアクセス制限されているかどうか
必要なロックを要求できない場合、または作業領域が互換性のないモードでアクセス制限されている場合は、エラーが生成されます。
表1-4に、Workspace Managerの操作と、その操作で特定の種類の作業領域(親作業領域、現行の作業領域、複数の親を持つ中間作業領域)がロックされる互換性のないアクセス制限モードを示します。表1-4:
-
N/Aは適用外、つまり互換性のないアクセス制御モードがないことを意味します。
-
排他 +は、排他ロックに加えて、作業領域ではセッションを実行できないことを意味します。
-
半排他は、
DBMS_LOCKプロシージャで使用されているSX_MODE定数を意味します。詳細は、Oracle AI Database PL/SQL言語リファレンスを参照してください。SX_MODEを集計オブジェクトで使用すると、排他ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。 -
共有半排他は、
DBMS_LOCKプロシージャで使用されているSSX_MODE定数を意味します。詳細は、Oracle AI Database PL/SQL言語リファレンスを参照してください。SSX_MODEを使用すると、集計オブジェクト全体で共有ロックを使用している一方、一部のサブパーツでは排他ロックも使用している可能性があることを示すことができます。 -
半共有は、
DBMS_LOCKプロシージャで使用されているSS_MODE定数を意味します。詳細は、Oracle AI Database PL/SQL言語リファレンスを参照してください。SS_MODEを集計オブジェクトで使用すると、共有ロックがオブジェクトのサブパーツに対して作動中であることを示すことができます。 -
共有(1)は、ROW_LEVEL_LOCKING=OFFの場合の共有半排他を除く共有を意味します。
CompressWorkspaceおよびCompressWorkspaceTreeでは、影響を受ける作業領域内の現在のバージョンが、1つ以上の他のバージョンとともに圧縮可能な範囲内にある場合、その作業領域に対する共有半排他ロックの取得が試行されます。取得できなかった場合、エラーは発生しませんが、現在のバージョンは圧縮されません。
create_savepointパラメータをtrueに設定してMergeTableプロシージャおよびMergeWorkspaceプロシージャが実行される場合、適用される親作業領域のロックはSSX(共有半排他)ロックです。
表1-4 操作および作業領域の種類別の互換性のないアクセス制限モード
| 操作 | 親作業領域 | 互換性のないアクセス制限モード | 現行の作業領域 | 互換性のないアクセス制限モード | 複数の親を持つ中間作業領域 | 互換性のないアクセス制限モード |
|---|---|---|---|---|---|---|
|
DML |
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION、 WM_ONLY |
なし |
N/A |
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL |
なし |
N/A |
|
|
共有 |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS、 ONEWRITER、 ONEWRITER_SESSION、 READ_ONLY |
排他 |
NO_ACCESS、 ONEWRITER、 ONEWRITER_SESSION、 READ_ONLY |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有(新規バージョンを作成する必要がある場合は共有半排他) |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
共有(新規バージョンを作成する必要がある場合は共有半排他) |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
排他 + |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL |
なし |
N/A |
|
|
なし |
N/A |
半共有 |
DEFERRED_REMOVAL、 NO_ACCESS脚注1 |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
MergeTable (remove_data=>false) |
共有 |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
半排他 |
DEFERRED_REMOVAL、 NO_ACCESS |
半排他 |
NO_ACCESS |
|
MergeTable (remove_data=>true) |
共有 |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
半排他 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
半排他 |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
|
MergeWorkspace (remove_workspace=>false) |
共有(1) |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS |
排他 |
NO_ACCESS |
|
MergeWorkspace (remove_workspace=>true) |
共有(1) |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
排他 + |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
排他 + |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
|
なし |
N/A |
なし。排他モードで表をロック |
なし |
なし |
N/A |
|
|
共有(1) |
NO_ACCESS |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
共有 |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
|
|
共有(1) |
NO_ACCESS |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
排他 |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
|
|
なし |
N/A |
排他 + |
N/A |
なし |
N/A |
|
|
共有(1) |
N/A |
排他 + |
NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
共有 |
N/A |
|
|
なし |
N/A |
排他 + |
DEFERRED_REMOVAL NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
排他 + |
DEFERRED_REMOVAL NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
|
|
なし |
NO_ACCESS |
半共有 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
半共有 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
半共有 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL、 NO_ACCESS |
なし |
N/A |
|
|
なし |
N/A |
共有半排他 |
DEFERRED_REMOVAL |
なし |
N/A |
|
|
なし |
N/A |
共有 |
DEFERRED_REMOVAL、 NO_ACCESS、 READ_ONLY、 ONEWRITER、 ONEWRITER_SESSION |
なし |
N/A |
脚注1
LIVE作業領域はNO_ACCESSモードにアクセス制限できません。
親トピック: Workspace Managerでのロック管理