トップ 差分 一覧 ping ソース 検索 ヘルプ PDF RSS ログイン

Oracle Database10g ロックの種類



目次



記事一覧

キーワード

Oracle Database10g ロックの種類

[Oracle][Oracle Database10g][DB2 ロック属性][DBパフォーマンス]


http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02/consist.htm#887512

 ロックの種類


Oracleのロックは次の3つのうちいずれか1つに分類
ロック 内容
DMLロック データを保護します。たとえば、表ロックは表全体をロックし、行ロックは選択された行をロック
DDLロック スキーマ・オブジェクトの構造、たとえば表とビューの定義を保護
内部ロックとラッチ データファイルなどの内部データベース構造を保護します。内部ロックとラッチは完全に自動的

DMLロック

  • 複数のユーザーが同時にアクセスするデータの整合性を保証することを目的とする。
  • 同時に実行される矛盾する複数のDML操作またはDDL操作の破損を招く干渉を防止する。
  • DML文では、表レベル・ロックおよび行レベル・ロックの両方が自動的に取得される

 行ロック(TX)

  • 2つのトランザクションによる同じ行の変更を防ぐ
  • 1つの文またはトランザクションで保持できる行ロックの数に制限はない
  • 行レベルのロックからロックの単位を拡大することはない(エスカレーションしない)
  • 行ロックでは、最もきめの細かいロックが実現されるため、最高の同時実行性とスループットが得られる

マルチバージョン同時実行性制御と行レベル・ロックを組み合せると、同じデータに関して複数のユーザーが競合するのは、同じ行にアクセスする場合のみ


 表ロック(TM)

  • DML操作中に表が削除されないようにするなど、主に同時実行DDL操作で同時実行性制御を行うために使用される
  • DDL文またはDML文が表に対するものである場合、表ロックが取得される
  • 表ロックは、行共有(RS)、行排他(RX)、共有(S)、共有行排他(SRX)および排他(X)のいずれかのモードで保持される

行共有表ロック(RS:Row Share)

  • 副共有表ロック、SSとも呼ぶ
  • 最も制限の緩やかなモードの表ロック
    • 他のトランザクションは、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できる
    • 他のトランザクションは、同じ表について同時に行共有ロック、行排他ロック、共有ロックおよび共有行排他ロックを取得できる

この表ロックを保持しているトランザクションが、その表の行をロックし、それらの行を更新する予定であることを示す


次のSQL文のいずれかが実行された場合自動的に取得される
SELECT ... FROM table ... FOR UPDATE OF ... ;  

LOCK TABLE table IN ROW SHARE MODE; 

LOCK TABLE ... IN ROW SHARE MODE に対して、SELECT ... FOR UPDATE は待ち


禁止される操作
    • 他のトランザクションが次の文のみを使用して同じ表に排他書込みアクセスを実行するのを防止

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; 

共有表ロック(S:Share)

次の文で指定される表について自動的に取得
LOCK TABLE table IN SHARE MODE; 
許可される操作

複数のトランザクションが、同じ表について同時に共有表ロックを保持できます。ただし、この場合、トランザクションは表を更新できません(FOR UPDATE句を指定したSELECT文の結果として行ロックを保持できたとしても更新できません)。


共有表ロックを保持しているトランザクションがその表を更新できるのは、他のトランザクションが同じ表について共有表ロックを保持していない場合のみです


禁止される操作
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; 

許可される操作

禁止される操作

表ロックのまとめ

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ロック要求がブロックされているのが確認できる



YAGI Hiroto (piroto@a-net.email.ne.jp)
twitter http://twitter.com/pppiroto

Copyright© 矢木 浩人 All Rights Reserved.