1. SELECT ... FOR UPDATE ⇒ 2. DDL(待機) ⇒ 3. UPDATE ⇒ 1. COMMIT ⇒ 2. DDL流れる ⇒ 3. ROLLBACK でどうなるか?(Oracle Database)
これもやってみましたやで彡(゚)(゚) まずはテストデータから。
--テストデータ 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文
しか無いので、あとは流れちゃうんですやね。彡(゚)(゚)