| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「Oracle Database10g ロックの種類」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の2版が非表示)
1行目: 1行目:
==Oracle Database10g ロックの種類==
+
==[[Oracle Database10g ロックの種類]]==
[[Oracle][Oracle Database10g][DB2 ロック属性]]{{category DBパフォーマンス}}
+
[[Oracle]] | [[Oracle Database10g]] | [[DB2 ロック属性]] | [[Category:DBパフォーマンス]]
  
 
{{amazon|4797349808}}
 
{{amazon|4797349808}}
6行目: 6行目:
 
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02/consist.htm#887512
 
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19215-02/consist.htm#887512
 
===ロックの種類===
 
===ロックの種類===
*Oracleは、トランザクションのためにリソースを自動的にロックし、他のトランザクションが同じリソースの排他的アクセスを要求する処理を行うことを防止します。
+
*Oracleは、[[トランザクション]]のためにリソースを自動的にロックし、他の[[トランザクション]]が同じリソースの排他的アクセスを要求する処理を行うことを防止します。
*トランザクションがそのリソースを必要としなくなると、ロックは自動的に解除されます。
+
*[[トランザクション]]がそのリソースを必要としなくなると、ロックは自動的に解除されます。
  
=====Oracleのロックは次の3つのうちいずれか1つに分類=====
+
=====[[Oracle]]のロックは次の3つのうちいずれか1つに分類=====
 
{|class="wikitable"
 
{|class="wikitable"
 
!ロック
 
!ロック
31行目: 31行目:
  
 
===行ロック(TX)===
 
===行ロック(TX)===
*2つのトランザクションによる同じ行の変更を防ぐ
+
*2つの[[トランザクション]]による同じ行の変更を防ぐ
*1つの文またはトランザクションで保持できる行ロックの数に制限はない
+
*1つの文または[[トランザクション]]で保持できる行ロックの数に制限はない
 
*行レベルのロックからロックの単位を拡大することはない(エスカレーションしない)
 
*行レベルのロックからロックの単位を拡大することはない(エスカレーションしない)
 
*行ロックでは、最もきめの細かいロックが実現されるため、最高の同時実行性とスループットが得られる
 
*行ロックでは、最もきめの細かいロックが実現されるため、最高の同時実行性とスループットが得られる
40行目: 40行目:
 
*DML操作中に表が削除されないようにするなど、主に同時実行DDL操作で同時実行性制御を行うために使用される
 
*DML操作中に表が削除されないようにするなど、主に同時実行DDL操作で同時実行性制御を行うために使用される
 
*DDL文またはDML文が表に対するものである場合、表ロックが取得される
 
*DDL文またはDML文が表に対するものである場合、表ロックが取得される
*表ロックは、行共有(RS)、行排他(RX)、共有(S)、共有行排他(SRX)および排他(X)のいずれかのモードで保持される
+
*表ロックは、行共有([[R]]S)、行排他([[R]]X)、共有(S)、共有行排他(S[[R]]X)および排他(X)のいずれかのモードで保持される
  
====行共有表ロック(RS:Row Share)====
+
====行共有表ロック([[R]]S:[[R]]ow Share)====
 
*副共有表ロック、SSとも呼ぶ
 
*副共有表ロック、SSとも呼ぶ
 
*最も制限の緩やかなモードの表ロック
 
*最も制限の緩やかなモードの表ロック
**他のトランザクションは、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できる
+
**他の[[トランザクション]]は、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できる
**他のトランザクションは、同じ表について同時に行共有ロック、行排他ロック、共有ロックおよび共有行排他ロックを取得できる
+
**他の[[トランザクション]]は、同じ表について同時に行共有ロック、行排他ロック、共有ロックおよび共有行排他ロックを取得できる
  
<blockquote>この表ロックを保持しているトランザクションが、その表の行をロックし、それらの行を更新する予定であることを示す</blockquote>
+
<blockquote>この表ロックを保持している[[トランザクション]]が、その表の行をロックし、それらの行を更新する予定であることを示す</blockquote>
  
=====次のSQL文のいずれかが実行された場合自動的に取得される=====
+
=====次の[[SQL]]文のいずれかが実行された場合自動的に取得される=====
  SELECT ... FROM table ... FOR UPDATE OF ... ;   
+
  SELECT ... F[[R]]OM table ... FO[[R]] UPDATE OF ... ;   
  
  LOCK TABLE table IN ROW SHARE MODE;  
+
  LOCK TABLE table IN [[R]]OW SHA[[R]]E MODE;  
  
<blockquote>LOCK TABLE ... IN ROW SHARE MODE に対して、SELECT ... FOR UPDATE は待ち</blockquote>
+
<blockquote>LOCK TABLE ... IN [[R]]OW SHA[[R]]E MODE に対して、SELECT ... FO[[R]] UPDATE は待ち</blockquote>
  
 
=====禁止される操作=====
 
=====禁止される操作=====
**他のトランザクションが次の文のみを使用して同じ表に排他書込みアクセスを実行するのを防止
+
**他の[[トランザクション]]が次の文のみを使用して同じ表に排他書込みアクセスを実行するのを防止
  
 
  LOCK TABLE table IN EXCLUSIVE MODE;
 
  LOCK TABLE table IN EXCLUSIVE MODE;
  
====行排他表ロック(RX:Row eXclusive)====
+
====行排他表ロック([[R]]X:[[R]]ow eXclusive)====
 
*副排他表ロック、SXとも呼ぶ
 
*副排他表ロック、SXとも呼ぶ
*このロックを保持しているトランザクションが、表の中の行に対して1つ以上の更新を行ったことを示す
+
*このロックを保持している[[トランザクション]]が、表の中の行に対して1つ以上の更新を行ったことを示す
 
*行共有表ロックよりも少し多くの制限
 
*行共有表ロックよりも少し多くの制限
  
 
=====許可される操作=====
 
=====許可される操作=====
*他のトランザクションは、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できます
+
*他の[[トランザクション]]は、同じ表の中の行に対して問合せ、挿入、更新、削除またはロックを同時に実行できます
*複数のトランザクションが同時に、同じ表について行排他ロックと行共有表ロックを取得できる
+
*複数の[[トランザクション]]が同時に、同じ表について行排他ロックと行共有表ロックを取得できる
  
 
*次のタイプの文によって修正される表について自動的に取得
 
*次のタイプの文によって修正される表について自動的に取得
  INSERT INTO table ... ;  
+
  INSE[[R]]T INTO table ... ;  
  
 
  UPDATE table ... ;  
 
  UPDATE table ... ;  
  
  DELETE FROM table ... ;   
+
  DELETE F[[R]]OM table ... ;   
  
  LOCK TABLE table IN ROW EXCLUSIVE MODE;  
+
  LOCK TABLE table IN [[R]]OW EXCLUSIVE MODE;  
  
 
=====禁止される操作=====
 
=====禁止される操作=====
*他のトランザクションが排他的な読取りや書込みを実行するために表を手動でロックすることを防止
+
*他の[[トランザクション]]が排他的な読取りや書込みを実行するために表を手動でロックすることを防止
  
 
*次の文を使用して同時に表をロックすることはできません
 
*次の文を使用して同時に表をロックすることはできません
  LOCK TABLE table IN SHARE MODE;   
+
  LOCK TABLE table IN SHA[[R]]E MODE;   
  
  LOCK TABLE table IN SHARE EXCLUSIVE MODE;  
+
  LOCK TABLE table IN SHA[[R]]E EXCLUSIVE MODE;  
  
 
  LOCK TABLE table IN EXCLUSIVE MODE;  
 
  LOCK TABLE table IN EXCLUSIVE MODE;  
 
====共有表ロック(S:Share)====
 
====共有表ロック(S:Share)====
 
=====次の文で指定される表について自動的に取得=====
 
=====次の文で指定される表について自動的に取得=====
  LOCK TABLE table IN SHARE MODE;  
+
  LOCK TABLE table IN SHA[[R]]E MODE;  
 
=====許可される操作=====
 
=====許可される操作=====
*他のトランザクションは、表の問合せ、SELECT ... FOR UPDATE文による特定行のロック、またはLOCK TABLE ... IN SHARE MODE文の実行のみが許可
+
*他の[[トランザクション]]は、表の問合せ、SELECT ... FOR UPDATE文による特定行のロック、またはLOCK TABLE ... IN SHARE MODE文の実行のみが許可
*他のトランザクションによる更新は許可されません
+
*他の[[トランザクション]]による更新は許可されません
  
<blockquote>複数のトランザクションが、同じ表について同時に共有表ロックを保持できます。ただし、この場合、トランザクションは表を更新できません(FOR UPDATE句を指定したSELECT文の結果として行ロックを保持できたとしても更新できません)。</blockquote>
+
<blockquote>複数の[[トランザクション]]が、同じ表について同時に共有表ロックを保持できます。ただし、この場合、[[トランザクション]]は表を更新できません(FOR UPDATE句を指定したSELECT文の結果として行ロックを保持できたとしても更新できません)。</blockquote>
  
<blockquote>共有表ロックを保持しているトランザクションがその表を更新できるのは、他のトランザクションが同じ表について共有表ロックを保持していない場合のみです</blockquote>
+
<blockquote>共有表ロックを保持している[[トランザクション]]がその表を更新できるのは、他の[[トランザクション]]が同じ表について共有表ロックを保持していない場合のみです</blockquote>
  
 
=====禁止される操作=====
 
=====禁止される操作=====
*他のトランザクションが同じ表を変更するのを禁止
+
*他の[[トランザクション]]が同じ表を変更するのを禁止
*他のトランザクションが次の文を実行することも禁止
+
*他の[[トランザクション]]が次の文を実行することも禁止
  LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;  
+
  LOCK TABLE table IN SHA[[R]]E [[R]]OW EXCLUSIVE MODE;  
  
 
  LOCK TABLE table IN EXCLUSIVE MODE;  
 
  LOCK TABLE table IN EXCLUSIVE MODE;  
  
  LOCK TABLE table IN ROW EXCLUSIVE MODE;  
+
  LOCK TABLE table IN [[R]]OW EXCLUSIVE MODE;  
  
 
====排他表ロック(X:eXclusive)====
 
====排他表ロック(X:eXclusive)====
117行目: 117行目:
  
 
=====許可される操作=====
 
=====許可される操作=====
*1つのトランザクションのみが、表の排他表ロックを取得できます。
+
*1つの[[トランザクション]]のみが、表の排他表ロックを取得できます。
*排他表ロックでは、他のトランザクションは同じ表に対する問合せのみを実行可能
+
*排他表ロックでは、他の[[トランザクション]]は同じ表に対する問合せのみを実行可能
  
 
=====禁止される操作=====
 
=====禁止される操作=====
*他のトランザクションによるDML文の実行とその表に対するロックの適用を禁止
+
*他の[[トランザクション]]によるDML文の実行とその表に対するロックの適用を禁止
  
 
====表ロックのまとめ ====
 
====表ロックのまとめ ====
 
{|class="wikitable"
 
{|class="wikitable"
!SQL
+
![[SQL]]
 
!表ロックモード
 
!表ロックモード
 
!RS
 
!RS
133行目: 133行目:
 
!X
 
!X
 
|-
 
|-
|SELECT ... FROM ...
+
|SELECT ... F[[R]]OM ...
 
|なし
 
|なし
 
|可
 
|可
141行目: 141行目:
 
|可
 
|可
 
|-
 
|-
|INSERT INTO ...
+
|INSE[[R]]T INTO ...
|RX
+
|[[R]]X
 
|可
 
|可
 
|可
 
|可
150行目: 150行目:
 
|-
 
|-
 
|UPDATE ...
 
|UPDATE ...
|RX
+
|[[R]]X
 
|可※
 
|可※
 
|可※
 
|可※
157行目: 157行目:
 
|否
 
|否
 
|-
 
|-
|DELTE FROM ...
+
|DELTE F[[R]]OM ...
|RX
+
|[[R]]X
 
|可※
 
|可※
 
|可※
 
|可※
165行目: 165行目:
 
|否
 
|否
 
|-
 
|-
|SELECT ... FROM ... FOR UPDATE OF ...
+
|SELECT ... F[[R]]OM ... FO[[R]] UPDATE OF ...
|RS
+
|[[R]]S
 
|可※
 
|可※
 
|可※
 
|可※
173行目: 173行目:
 
|否
 
|否
 
|-
 
|-
|LOCK TABLE ... IN ROW SHARE MODE
+
|LOCK TABLE ... IN [[R]]OW SHA[[R]]E MODE
|RS
+
|[[R]]S
 
|可
 
|可
 
|可
 
|可
181行目: 181行目:
 
|否
 
|否
 
|-
 
|-
|LOCK TABLE ... IN ROW EXCLUSIVE MODE
+
|LOCK TABLE ... IN [[R]]OW EXCLUSIVE MODE
|RX
+
|[[R]]X
 
|可
 
|可
 
|可
 
|可
189行目: 189行目:
 
|否
 
|否
 
|-
 
|-
|LOCK TABLE ... IN SHARE MODE
+
|LOCK TABLE ... IN SHA[[R]]E MODE
 
|S
 
|S
 
|可
 
|可
197行目: 197行目:
 
|否
 
|否
 
|-
 
|-
|LOCK TABLE ... IN SHARE ROW EXCLUSIVE MODE
+
|LOCK TABLE ... IN SHA[[R]]E [[R]]OW EXCLUSIVE MODE
|SRX
+
|S[[R]]X
 
|可
 
|可
 
|否
 
|否
214行目: 214行目:
 
|-
 
|-
 
|}
 
|}
※別のトランザクションによって、競合する行ロックが保持されていない場合。そうでない場合は待機が発生。
+
※別の[[トランザクション]]によって、競合する行ロックが保持されていない場合。そうでない場合は待機が発生。
  
 
===ロックをかけてみる===
 
===ロックをかけてみる===
 
*実際にロックをかけて、Enterprise Managerで確認する
 
*実際にロックをかけて、Enterprise Managerで確認する
====パフォーマンスリージョン - その他の管理リンク - インスタンス・ロック====
+
====パフォーマンスリージョン - [[その他]]の管理リンク - インスタンス・ロック====
 
[[File:0933_ora_lock.jpg]]
 
[[File:0933_ora_lock.jpg]]
====SHARE表ロックをかける====
+
====SHA[[R]]E表ロックをかける====
*SQL*Plus から SHARE表ロックをかける
+
*[[SQL]]*Plus から SHARE表ロックをかける
*SHARE表ロックが獲得されたのが確認できる
+
*SHA[[R]]E表ロックが獲得されたのが確認できる
 
[[File:0935_ora_lock_tm_s.jpg]]
 
[[File:0935_ora_lock_tm_s.jpg]]
====SHAREロックを取得したトランザクションから行を更新====
+
====SHAREロックを取得した[[トランザクション]]から行を更新====
*SHARE表ロックが、SHARE ROW EXCLUSIVE表ロックに変わり、EXCLUSIVE行ロックが獲得されたのが分かる
+
*SHA[[R]]E表ロックが、SHA[[R]]E [[R]]OW EXCLUSIVE表ロックに変わり、EXCLUSIVE行ロックが獲得されたのが分かる
 
[[File:0936_ora_lock_tm_srx.jpg]]
 
[[File:0936_ora_lock_tm_srx.jpg]]
====ROW EXCLUSIVE表ロックを要求====
+
====[[R]]OW EXCLUSIVE表ロックを要求====
*行を更新したトランザクションが継続中なので、ROW EXCLUSIVEロック要求がブロックされているのが確認できる
+
*行を更新した[[トランザクション]]が継続中なので、ROW EXCLUSIVEロック要求がブロックされているのが確認できる
 
[[File:0934_ora_lock_tm_rx.jpg]]
 
[[File:0934_ora_lock_tm_rx.jpg]]

2020年2月16日 (日) 04:30時点における最新版

Oracle Database10g ロックの種類

Oracle | Oracle Database10g | DB2 ロック属性 |

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

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

表ロック(TM)

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

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

  • 副共有表ロック、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; 

共有表ロック(S:Share)

次の文で指定される表について自動的に取得
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; 
許可される操作
禁止される操作

表ロックのまとめ

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で確認する

パフォーマンスリージョン - その他の管理リンク - インスタンス・ロック

0933 ora lock.jpg

SHARE表ロックをかける

  • SQL*Plus から SHARE表ロックをかける
  • SHARE表ロックが獲得されたのが確認できる

0935 ora lock tm s.jpg

SHAREロックを取得したトランザクションから行を更新

  • SHARE表ロックが、SHARE ROW EXCLUSIVE表ロックに変わり、EXCLUSIVE行ロックが獲得されたのが分かる

0936 ora lock tm srx.jpg

ROW EXCLUSIVE表ロックを要求

  • 行を更新したトランザクションが継続中なので、ROW EXCLUSIVEロック要求がブロックされているのが確認できる

0934 ora lock tm rx.jpg