Oracle Database10g ロックの種類
ナビゲーションに移動
検索に移動
目次
Oracle Database10g ロックの種類
Oracle | Oracle Database10g | DB2 ロック属性 | テンプレート:Category DBパフォーマンス
ロックの種類
- Oracleは、トランザクションのためにリソースを自動的にロックし、他のトランザクションが同じリソースの排他的アクセスを要求する処理を行うことを防止します。
- トランザクションがそのリソースを必要としなくなると、ロックは自動的に解除されます。
Oracleのロックは次の3つのうちいずれか1つに分類
ロック | 内容 |
---|---|
DMLロック | データを保護します。たとえば、表ロックは表全体をロックし、行ロックは選択された行をロック |
DDLロック | スキーマ・オブジェクトの構造、たとえば表とビューの定義を保護 |
内部ロックとラッチ | データファイルなどの内部データベース構造を保護します。内部ロックとラッチは完全に自動的 |
DMLロック
- 複数のユーザーが同時にアクセスするデータの整合性を保証することを目的とする。
- 同時に実行される矛盾する複数のDML操作またはDDL操作の破損を招く干渉を防止する。
- DML文では、表レベル・ロックおよび行レベル・ロックの両方が自動的に取得される
行ロック(TX)
- 2つのトランザクションによる同じ行の変更を防ぐ
- 1つの文またはトランザクションで保持できる行ロックの数に制限はない
- 行レベルのロックからロックの単位を拡大することはない(エスカレーションしない)
- 行ロックでは、最もきめの細かいロックが実現されるため、最高の同時実行性とスループットが得られる
<blockquote>マルチバージョン同時実行性制御と行レベル・ロックを組み合せると、同じデータに関して複数のユーザーが競合するのは、同じ行にアクセスする場合のみ</blockquote>
表ロック(TM)
- DML操作中に表が削除されないようにするなど、主に同時実行DDL操作で同時実行性制御を行うために使用される
- DDL文またはDML文が表に対するものである場合、表ロックが取得される
- 表ロックは、行共有(RS)、行排他(RX)、共有(S)、共有行排他(SRX)および排他(X)のいずれかのモードで保持される
- 副共有表ロック、SSとも呼ぶ
- 最も制限の緩やかなモードの表ロック
- 他のトランザクションは、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できる
- 他のトランザクションは、同じ表について同時に行共有ロック、行排他ロック、共有ロックおよび共有行排他ロックを取得できる
<blockquote>この表ロックを保持しているトランザクションが、その表の行をロックし、それらの行を更新する予定であることを示す</blockquote>
次のSQL文のいずれかが実行された場合自動的に取得される
SELECT ... FROM table ... FOR UPDATE OF ... ;
LOCK TABLE table IN ROW SHARE MODE;
<blockquote>LOCK TABLE ... IN ROW SHARE MODE に対して、SELECT ... FOR UPDATE は待ち</blockquote>
禁止される操作
- 他のトランザクションが次の文のみを使用して同じ表に排他書込みアクセスを実行するのを防止
LOCK TABLE table IN EXCLUSIVE MODE;
行排他表ロック(RX:Row eXclusive)
- 副排他表ロック、SXとも呼ぶ
- このロックを保持しているトランザクションが、表の中の行に対して1つ以上の更新を行ったことを示す
- 行共有表ロックよりも少し多くの制限
許可される操作
- 他のトランザクションは、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できます
- 複数のトランザクションが同時に、同じ表について行排他ロックと行共有表ロックを取得できる
- 次のタイプの文によって修正される表について自動的に取得
INSERT INTO table ... ;
UPDATE table ... ;
DELETE FROM table ... ;
LOCK TABLE table IN ROW EXCLUSIVE MODE;
禁止される操作
- 他のトランザクションが排他的な読取りや書込みを実行するために表を手動でロックすることを防止
- 次の文を使用して同時に表をロックすることはできません
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
次の文で指定される表について自動的に取得
LOCK TABLE table IN SHARE MODE;
許可される操作
- 他のトランザクションは、表の問合せ、SELECT ... FOR UPDATE文による特定行のロック、またはLOCK TABLE ... IN SHARE MODE文の実行のみが許可
- 他のトランザクションによる更新は許可されません
<blockquote>複数のトランザクションが、同じ表について同時に共有表ロックを保持できます。ただし、この場合、トランザクションは表を更新できません(FOR UPDATE句を指定したSELECT文の結果として行ロックを保持できたとしても更新できません)。</blockquote>
<blockquote>共有表ロックを保持しているトランザクションがその表を更新できるのは、他のトランザクションが同じ表について共有表ロックを保持していない場合のみです</blockquote>
禁止される操作
- 他のトランザクションが同じ表を変更するのを禁止
- 他のトランザクションが次の文を実行することも禁止
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE;
LOCK TABLE table IN ROW EXCLUSIVE MODE;
排他表ロック(X:eXclusive)
- 最も多くの制限が課されるモードの表ロック
- 表に排他的に書込みアクセスすることを許可
次の文で指定された表について取得
LOCK TABLE table IN EXCLUSIVE MODE;
許可される操作
- 1つのトランザクションのみが、表の排他表ロックを取得できます。
- 排他表ロックでは、他のトランザクションは同じ表に対する問合せのみを実行可能
禁止される操作
- 他のトランザクションによるDML文の実行とその表に対するロックの適用を禁止
表ロックのまとめ
SQL | 表ロックモード | RS | RX | S | SRX | X |
---|---|---|---|---|---|---|
SELECT ... FROM ... | なし | 可 | 可 | 可 | 可 | 可 |
INSERT INTO ... | RX | 可 | 可 | 否 | 否 | 否 |
UPDATE ... | RX | 可※ | 可※ | 否 | 否 | 否 |
DELTE FROM ... | RX | 可※ | 可※ | 否 | 否 | 否 |
SELECT ... FROM ... FOR UPDATE OF ... | RS | 可※ | 可※ | 可※ | 可※ | 否 |
LOCK TABLE ... IN ROW SHARE MODE | RS | 可 | 可 | 可 | 可 | 否 |
LOCK TABLE ... IN ROW EXCLUSIVE MODE | RX | 可 | 可 | 否 | 否 | 否 |
LOCK TABLE ... IN SHARE MODE | S | 可 | 否 | 可 | 否 | 否 |
LOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE | SRX | 可 | 否 | 否 | 否 | 否 |
LOCK TABLE ... IN EXCLUSIVE MODE | X | 否 | 否 | 否 | 否 | 否 |
※別のトランザクションによって、競合する行ロックが保持されていない場合。そうでない場合は待機が発生。
ロックをかけてみる
- 実際にロックをかけて、Enterprise Managerで確認する
パフォーマンスリージョン - その他の管理リンク - インスタンス・ロック
SHARE表ロックをかける
- SQL*Plus から SHARE表ロックをかける
- SHARE表ロックが獲得されたのが確認できる
SHAREロックを取得したトランザクションから行を更新
- SHARE表ロックが、SHARE ROW EXCLUSIVE表ロックに変わり、EXCLUSIVE行ロックが獲得されたのが分かる
ROW EXCLUSIVE表ロックを要求
- 行を更新したトランザクションが継続中なので、ROW EXCLUSIVEロック要求がブロックされているのが確認できる
© 2006 矢木浩人