ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

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文

しか無いので、あとは流れちゃうんですやね。彡(゚)(゚)