これもやってみましたやで彡(゚)(゚) まずはテストデータから。
テストデータ
SELECT C1 FROM TBL_A;
C1
----------
1
2
- Session1(SELECT ... FOR UPDATE文)
SELECT 1 FROM TBL_A WHERE C1 = 1 FOR UPDATE;
1
----------
1
23:05:42 SQL>
- Session2(ALTER TABLE文)
※待たされる
ALTER TABLE TBL_A ADD (C2 VARCHAR2(10));
- Session3(※Session1とは異なるレコードをUPDATE)
※すぐ実行される
UPDATE TBL_A SET C1 = 3 WHERE C1 = 2;
1 row updated.
23:05:58 SQL>
- Session1の続き(COMMITしてロック解放)
COMMIT;
Commit complete.
23:06:26 SQL>
- Session2の続き
※待たされていたDDLが流れる。
Table altered.
23:06:26 SQL>
- Session3の続き(ROLLBACK)
※上手く行く。
ROLLBACK;
Rollback complete.
23:06:30 SQL>
結局ロックが競合するポイントが最初の
Session1のFOR UPDATE ← Session2のALTER文
しか無いので、あとは流れちゃうんですやね。彡(゚)(゚)