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

MyMemoWiki

差分

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

案内メニュー