連載
» 2007年07月13日 00時00分 公開

ORACLE MASTER Silver DBA講座(18):ロックでOracleのデータを守り、競合を防ぐ (1/2)

ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!

[有限会社 G.F.インフィニティ (Project - ∞)]

 前回「UNDO管理でOracleのデータを守る」で、UNDOデータの管理に関するUNDO表領域、UNDOセグメントの構成や各種初期化パラメータについて紹介しました。今回は、ロックの競合の監視と解決を学びましょう。

ロックの競合の監視と解決

ポイント

 DML文を実行したときに取得されるロックの種類と、ロック競合が発生したときの監視方法が対象となります。ロック競合の中でも、特にデッドロックについては確認しておいた方がよいでしょう。

ロック

 ロックとは、複数のセッションから同時にデータを変更されないようにレコードを保護するメカニズムです。OracleサーバではDML文の発行時に、自動的に2種類のロックが取得されます。

  • 行に対する排他行ロック

同じレコードに対するDML文が発行されることを防止します。トランザクションが完了する前に同じレコードに対するDML文が発行されると、後からDML文を実行したセッションはロック待機状態となり、何も処理できなくなります。

  • 表に対する共有表ロック

同時にDDL文が発行されることを防止します。DML文によるトランザクションが完了する前に同じテーブルに対するDDL文が発行されると、DDL文を実行したセッションに次のエラーが戻されます。

SQL> TRUNCATE TABLE scott.emp;
TRUNCATE TABLE scott.emp
                     *
行1でエラーが発生しました。:
ORA-00054: リソース・ビジー、NOWAITが指定されていました。

 レコードに対するロックは手動で行うこともできます。本来はSELECT文はロックを取得しませんが、次のようにFOR UPDATE句がある場合、問い合わせ結果のレコードに対して排他行ロックが取得されます。

SQL> SELECT * FROM emp WHERE empno=7900 FOR UPDATE;

 テーブルに対するロックも手動で行うことができます。DML文発行時には、自動的に表に対して共有表ロックが取得されますが、次のようにLOCK TABLE文でEXCLUSIVEを指定すると、排他表ロックが取得されます。

SQL> LOCK TABLE emp IN EXCLUSIVE MODE;

 SELECT文とLOCK TABLE文でNOWAIT句を最後に付けると、ロックが取得できないときに、ロック待機するのではなくエラー(リソースビジー)として制御を戻すことができます。

ロック競合

 Oracleサーバにおけるロック管理は、「エンキューメカニズム」が担当しています。エンキューメカニズムでは、次のことが追跡されます。

  • ロック待機中のセッション
  • 要求されたロックモード
  • セッションがロックを要求した順序

 新規にロックを取得しようとすると、ロックのためのキュー(待ち行列)に追加されます。取得できなければロックが取得できるまでキューで待機します。既存のロックがよりレベルの高いロックへの変換を必要とした場合は、キューに入り直すことなくロック変換が行えます。

 ロックの競合とは、同じリソースの取得を待ち合ってしまうことです。例えば以下の例で、トランザクション2が処理できる状態になるのは、トランザクション1のロックが解放されるコミット時のタイミングです。

図1 2つのトランザクションによるロック競合 図1 2つのトランザクションによるロック競合

 このように、ロック競合は、変更がコミットされずトランザクションが長くなってしまうと発生しやすいといえます。また、LOCK TABLEやSELECT ... FOR UPDATE文による手動ロックが不適切に使用されている場合も、ロック競合の原因となります。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。