ORACLE MASTER資格の中級に位置付けられ、取得すればOracle技術者としてグローバルに認定される「ORACLE MASTER Silver Oracle Database 10g」。例題を利用してポイントを押さえ、確実な合格を目指そう!
前回「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句を最後に付けると、ロックが取得できないときに、ロック待機するのではなくエラー(リソースビジー)として制御を戻すことができます。
Copyright © ITmedia, Inc. All Rights Reserved.