使用 SELECT ... FOR UPDATE 子句鎖定查詢到的記錄,防止其他 Session 修改。
-- Session 1
CONN system/manager
GRANT CONNECT,RESOURCE TO test IDENTIFIED BY test;
CONN test/test
CREATE TABLE a(a NUMBER);
INSERT INTO a VALUES(1);
COMMIT;
SELECT * FROM a FOR UPDATE; -- 或 FOR UPDATE OF a.a
-- 記錄被鎖定
-- Session 2 (新視窗)
CONN test/test
DELETE FROM a; -- 此處阻塞等待鎖釋放
-- Session 1 執行
ROLLBACK; -- 或 COMMIT
-- Session 2 繼續執行刪除
鎖定釋放條件:執行 COMMIT 或 ROLLBACK。