ロックの種類

表ロック時に発生する TM エンキューをトレースするには、V$LOCK パフォーマンスビューを理解する必要がある。まず、TMの種類と関係について

1+5 の表ロックモード

LMODEの数字が大きいほど、重度なロックとなる。

LMODEロックの名称呼称旧呼称(別名)?
1なしNULL
2行共有ロックRS/SSRow ShareSub Share
3行排他ロックRX/SXRow eXclusiveSub eXclusive
4共有ロックSShare
5共有行排他ロックSRX/SSXShare Row eXculsiveShare Sub eXculsive
6排他ロックXeXclusive

表ロック同士の関係マトリックス

SELECT / INSERT / UPDATE / DELETE / LOCK TABLE の排他

L*1表ロック先に行なっているコマンドの例別セッションの後続処理に許可されるロックモード(操作)
行共有行排他共有共有
行排他
排他
1なしSELECT ... FROM table ...
2行共有SELECT ... FOR UPDATE [OF ...]×
LOCK TABLE ...
ROW SHARE MODE
×
3行排他INSERT INTO table ...×××
UPDATE table ...×××
DELETE FROM table ...×××
LOCK TABLE ...
ROW EXCLUSIVE MODE
×××
4共有LOCK TABLE ...
SHARE MODE
×××
5共有
行排他
LOCK TABLE ...
SHARE ROW EXCLUSIVE MODE
××××
6排他LOCK TABLE ...
EXCLUSIVE MODE
×××××

ロックを取得可能
× ロックの取得は不可能
ロックを取得可能であるが別セッションからの同一行へのアクセスは待機させられる(TX待機)
ロックを取得可能であるが別セッションからの プライマリキー制約、ユニーク制約 に該当する行の INSERT は待機させられる(TX待機)

▲ ▼ に関して:トランザクションが分散トランザクションの場合には初期化パラメータによってタイムアウトが発生する。
参考 ⇒ ORA-02049: タイムアウト: 分散トランザクションがロックを待機しています。

共有ロックと排他ロック

  • 共有ロック

    共有ロックとは主に参照を行う際に掛けるロックであり複数設定することも可能。しかし SELECT の度にロックを掛けているわけではなく、データや表定義が変更されると困る操作のときにだけ掛けられる。
    例: 更新予定の行を宣言して SELECT する(RSロック)、インデックスの作成中に本体である表定義が変更されないようにロックするなどである。(Sロック)

    簡単に言うと、読み取りが終了(もしくは終わりと宣言 COMMIT,ROLLBACK)するまで または テーブル定義 は変更しないでねフラグを立てる。

  • 排他ロック

    排他ロックとは更新を行なう際に掛けるロックであり 1リソース(行や表)に対して 1つだけ設定できる。
    こちらは同じリソースを同時に更新させないようにするためのもの。

行共有ロック(RS / SS)

SELECT ...FOR UPDATE 文により「表」に掛けられるロック。
注意: SELECT FOR UPDATE WAIT による WAIT の秒数指定は排他ロック(X) された表に対しては無効になってしまう。

DDL: DROP TABLE(Xロック)、ダイレクト・パス・インサート(X) などが実行できなくなる。

行排他ロック(RX / SX)

INSERT,UPDATE,DELETE 文により、「表」に掛けられるロック。

ALTER INDEX 〜 REBUILD ONLINE; (Sロック)が待機する。
インデックスを張っていない外部制約のケースでは行排他ロックから共有ロックや共有行排他ロックへエスカレートする可能性があるので注意が必要(簡単に回避できる:関連事項 ガイドライン参照)

共有ロック(S)

LOCK TABLE table IN SHARE MODE
一部のDDL CREATE INDEX /VIEW/PROCEDURE/SYNONYM などにより「表」に掛けられるロック。

ALTER INDEX 〜 REBUILD ONLINE ; (Sロック) では待機状態になる。(CREATE INDEX は NOWAIT)

共有行排他ロック(SRX / SSX)

LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE により「表」に掛けられるロック。

身近で、どのSQLコマンドが該当するか、わかりませんでした。
インデックスを張っていない外部制約のケース で CASCADE 設定時に間接的に発生する。

排他ロック(X)

LOCK TABLE table IN EXCLUSIVE MODE
DROP TABLE / ALTER TABLE などにより「表」に掛けられるロック。
一部のDML(ダイレクト・パス・インサート)でも発生する。

 


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)

*1 LockMODE:V$LOCK パフォーマンスビュー(LMODE)