| 方式 | 關鍵字 | 粒度 | 兼容性 | 典型用途 |
| 共享封鎖 | SHARE | 表級 | 兼容 Share/Share Update | 一致性查詢 (凍結表數據) |
| 排它封鎖 | EXCLUSIVE | 表級 | 不兼容任何鎖 | 大批量更新、避免死鎖預鎖多表 |
| 共享更新封鎖 | SHARE UPDATE | 行級 | 兼容 Share/Share Update (不同行) | 高並發 OLTP 行級更新 |
2. 共享模式表封鎖 (LOCK TABLE ... IN SHARE MODE)
LOCK TABLE emp, dept IN SHARE MODE [NOWAIT];
-- 效果:所有會話可查詢,不可 UPDATE/DELETE/INSERT
-- 釋放:COMMIT / ROLLBACK / LOGOFF / 進程終止
-- 用途:報表查詢期間凍結數據,防止「讀取中數據變化」
3. 排它模式表封鎖 (LOCK TABLE ... IN EXCLUSIVE MODE)
LOCK TABLE emp IN EXCLUSIVE MODE [NOWAIT];
-- 效果:持有者可查/改,其他會話僅可查,不可任何鎖/改
-- 隱式獲取:INSERT/UPDATE/DELETE 自動獲取行鎖+表級 RX (Mode 3)
-- 釋放條件同共享模式
-- 用途:多表關聯更新前預鎖,統一順序避免死鎖
4. 共享更新封鎖 — 行級鎖 (核心並發機制)
兩種獲取方式:
- 顯式:
LOCK TABLE emp IN SHARE UPDATE MODE [NOWAIT] — 預鎖整表行級意向
- 隱式 (標準):
SELECT ... FROM emp WHERE deptno=10 FOR UPDATE OF sal [NOWAIT] — 精確鎖定符合條件的行
行級鎖特性:
- 永遠是 排它 (X) 模式 — 同一行同一時間僅一會話可更新
- 其他會話:可查詢、可鎖其他行、不可更新被鎖行 (等待)
- ITL 槽存儲鎖信息,無中央鎖表,無鎖升級
- 釋放:COMMIT / LOGOFF / 進程終止 — ROLLBACK 不釋放行鎖 (直到事務真正結束)
四、 鎖兼容性矩陣 (簡化版)
| 已持有 \ 申請 | Share (S) | Exclusive (X) | Share Update (SU) |
| Share (S) | ✅ | ❌ | ✅ (但 SU 持有者不可更新) |
| Exclusive (X) | ❌ | ❌ | ❌ |
| Share Update (SU) | ✅ | ❌ | ✅ (不同行) / ❌ (同行更新時轉 X 等待) |
五、 死鎖:成因、檢測、預防鐵律
經典死鎖場景
-- Session 1
UPDATE accounts SET bal=bal-100 WHERE id=1; -- 鎖行 1
UPDATE accounts SET bal=bal+100 WHERE id=2; -- 等待行 2
-- Session 2
UPDATE accounts SET bal=bal-50 WHERE id=2; -- 鎖行 2
UPDATE accounts SET bal=bal+50 WHERE id=1; -- 等待行 1 → 死鎖
Oracle 自動處理
- 定期掃描等待圖,發現環路
- 選擇 代價最小 (Undo 量最少/執行時間最短) 會話犧牲
- 回滾其事務,釋放所有鎖,返回
ORA-00060
- 其他會話繼續執行
預防四大鐵律
- 統一多表/多行操作順序 (如永遠按 ID 升序更新)
- UPDATE/DELETE 盡量使用 WHERE 主鍵/唯一索引,縮小鎖範圍
- 完成修改立即 COMMIT,縮短鎖持有時間
- 高併發期 禁用 DDL/大表維護,避免 Mode 6 阻塞
六、 總結
三級封鎖各司其職:內部級 (閂鎖) 守護內存、DDL 級 (字典鎖) 守護元數據、DML 級 (行/表鎖) 守護業務數據。DML 級中,**行級 Share Update (FOR UPDATE) 是並發 OLTP 的靈魂**,配合「統一順序、縮小範圍、快速提交」三原則,構建高併發低阻塞的事務處理體系。
- 上一篇文章: Oracle 聯機備份 (Online Backup) 核心原理與實施全流程:ARCHIVELOG 模式下的數據零損失保障
- 下一篇文章: Oracle 遷移 MySQL 完整避坑指南:大小寫、保留字、數據類型、自增、索引長度五大差異與兼容性設計原則
Copyright ©
程式碼之家 All Rights Reserved