ロックの種類
表ロック時に発生する TM エンキューをトレースするには、V$LOCK パフォーマンスビューを理解する必要がある。まず、TMの種類と関係について
1+5 の表ロックモード
LMODEの数字が大きいほど、重度なロックとなる。
LMODE | ロックの名称 | 呼称 | 旧呼称(別名)? |
1 | なし | NULL | | |
2 | 行共有ロック | RS/SS | Row Share | Sub Share |
3 | 行排他ロック | RX/SX | Row eXclusive | Sub eXclusive |
4 | 共有ロック | S | Share |
5 | 共有行排他ロック | SRX/SSX | Share Row eXculsive | Share Sub eXculsive |
6 | 排他ロック | X | eXclusive |
表ロック同士の関係マトリックス
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(ダイレクト・パス・インサート)でも発生する。
関連事項