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

ロックでOracleのデータを守り、競合を防ぐORACLE MASTER Silver DBA講座(18)(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句を最後に付けると、ロックが取得できないときに、ロック待機するのではなくエラー(リソースビジー)として制御を戻すことができます。

ロック競合

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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