プライマリ・コンテンツに移動
Oracle® Database SQL言語リファレンス
11gリリース2 (11.2)
B56299-08
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

DML操作での自動ロック

DMLロック(データ・ロックとも呼ぶ)の目的は、複数のユーザーが同時にアクセスするデータの整合性を保証することです。たとえば、DMLロックを使用すると、オンライン・ブックショップで在庫が残り1冊となった本を複数の顧客が購入してしまうことを回避できます。DMLロックは、同時に実行される矛盾するDML操作またはDDL操作による破壊的な干渉を防ぎます。

DML文では、表レベルと行レベルの両方のロックが自動的に取得されます。次の各項で、それぞれのタイプのロックまたはロック・モードの後のカッコ内にある頭字語は、Oracle Enterprise Managerのロック・モニターで使用される略称です。Enterprise Managerでは、表ロックのモード(RS、SRXなど)が示されるかわりに、すべての表ロックについてTMと表示される場合があります。

次に、行ロックおよび表ロックのタイプの概要を示します。行ロックおよび表ロックのタイプの詳細は、『Oracle Database概要』を参照してください。

行ロック(TX) 行ロック(TXロックとも呼ぶ)は、表の1つの行に対するロックです。INSERTUPDATEDELETEMERGEおよびSELECT ... FOR UPDATE文のいずれかで変更される行ごとに、トランザクションは行ロックを取得します。行ロックは、トランザクションがコミットされるかロールバックされるまで保持されます。

ある行について行ロックを取得したトランザクションは、その行に対応する表についての表ロックも取得します。この表ロックによって、現行のトランザクション内のデータ変更を上書きするDDL操作の競合が回避されます。

表ロック(TM) INSERTUPDATEDELETEMERGEおよびSELECT ... FOR UPDATE文で表が変更される場合、トランザクションは表ロック(TMロック)を自動的に取得します。これらのDML操作が表ロックを必要とするのは、トランザクションのために表へのDMLアクセスを確保すること、およびトランザクションと競合する可能性のあるDDL操作を防止するという2つの目的のためです。表ロックは、LOCK TABLE文(「手動データ・ロック」を参照)を使用して明示的に取得できます。

表ロックは、次のモードで保持できます。

DML操作でのロック

Oracle Databaseでは、DML操作を実行すると行レベルと表レベルのロックが自動的に取得されます。ロック動作は操作の種類によって決まります。表B-1は、この項の情報をまとめたものです。


注意:

表B-1のDML文に示されている暗黙のSXロックは、制約の影響により一時的に排他(X)ロックになることがあります。

表B-1 DML文で取得されるロックのまとめ

SQL文 行ロック 表ロック・モード RS RX S SRX X

SELECT ... FROM ...


なし

INSERT INTO ...

SX

UPDATE ...

SX

脚注 1 

脚注 1

MERGE INTO ...

SX

DELETE FROM ...

SX

脚注 1

脚注 1

SELECT ... FROM table FOR UPDATE OF ...

SX

脚注 1

脚注 1

LOCK TABLE table IN ...








   ROW SHARE MODE


SS

   ROW EXCLUSIVE MODE


SX

   SHARE MODE


S

   SHARE ROW EXCLUSIVE MODE


SSX

   EXCLUSIVE MODE


X


脚注 1 競合する行ロックが他のトランザクションで保持されていない場合に可になります。それ以外の場合は待機します。

行を問い合せるときのロック

問合せは、SELECT文の場合のように明示的に行われることも、ほとんどのINSERTMERGEUPDATEおよびDELETE文の場合のように暗黙的に行われることもあります。問合せコンポーネントを含まなくてもかまわない唯一のDML文は、VALUES句を伴うINSERT文です。問合せはデータを読み取るのみであるため、他のSQL文に対してほとんど干渉しないSQL文です。

次の特性は、FOR UPDATE句を伴わない問合せが該当します。

行を変更するときのロック

一部のデータベースでは、ロック・マネージャを使用してメモリー内のロック・リストをメンテナンスします。一方、Oracle Databaseでは、ロックされている行を含むデータ・ブロックにロック情報を格納します。各行ロックが影響するのは1つの行のみです。

Oracle Databaseでは、キューイング・メカニズムを使用して行ロックを取得します。行ロックを必要とするトランザクションは、まだ行がロックされていなければ、行のデータ・ブロックにロックを取得します。トランザクション自体は、ブロック・ヘッダーの対象トランザクション・リスト(ITL)・セクションにエントリが記録されます。このトランザクションで変更されるそれぞれの行は、ITLに格納されたトランザクションIDのコピーをポイントします。したがって、同じブロックに含まれる100行を1つのトランザクションで変更する場合は100個の行ロックが必要ですが、100行すべてが1つのトランザクションIDを参照します。

トランザクションが終了すると、トランザクションIDはデータ・ブロック・ヘッダーのITLセクションにそのまま残ります。新しいトランザクションで行の変更が必要になると、ロックがアクティブかどうかの判断は、そのトランザクションIDを使用して行われます。ロックがアクティブな場合、新しいトランザクションのセッションは、ロックが解除されたときの通知を要求します。アクティブでない場合は、新しいトランザクションがロックを取得します。

INSERTUPDATEDELETEおよびSELECT ... FOR UPDATE文の特性は次のとおりです。


関連項目:

外部キーのロックの詳細は、『Oracle Database概要』を参照してください。