ロック競合の診断

  • ロックのメカニズム
    • Oracleでは行レベルロックを採用しているためデッドロックが起こりにくい
    • DML文では
      • 排他行ロック
      • 共有表ロック を取得する
    • Oracleにおいて、ロックはエンキュー・メカニズムによって管理される
    • エンキュー・メカニズムが追跡、記録している情報
      • セッションがロックを要求している順序
      • 別のセッションが保持しているロックを待機しているセッション
      • セッションが要求しているロック・モード
  • ロック関連のSQL
    • select ... for update [ NOWAIT | WAIT n ]
    • lock table ... in EXCLUSIVE|SHAREなど MODE [NOWAIT]
  • DDLロック
    • 排他DDLロック
      • CREATE
      • ALTER
      • DROP など、ほとんどすべてのDDL
    • 共有DDL
      • AUDIT, NOAUDIT
      • CREATE VIEW
      • CREATE PROCEDURE など、表が無くならなければ良い程度のもの
  • ロック競合の原因
    • 不必要に長いトランザクションのコーディング
    • 不必要に高いロック・レベルのコーディング
    • 必要な場合に変更をコミットしていない
    • より高いロック・レベルを必要とするサード・パーティ製品と組み合わせて使用
  • ロック競合を確認できるビューなど
    • v$lock
    • v$lock_object
    • v$session
    • v$sysstat
    • ctllocktスクリプト(事前にcatblock.sqlを実行)
  • ロックの強制終了(ハングアップ時など)
    • V$SESSSIONビューにてセッションを識別
    • ALTER SYSTEM KILL SESSION 'sid, serial#' でセッションを強制終了