Oracle 锁机制深度解析
Oracle 锁机制深度解析
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
锁机制保证并发数据一致性[1]:
类型:
- DML 锁
- DDL 锁
- Latch
- Mutex
详细见:Oracle 事务与锁机制。
2. DML 锁
2.1 TX(事务锁)
- 行级
- 事务开始获取
- 事务结束释放
- 防止并发修改
2.2 TM(表锁)
- 表级
- DML 时获取
- 防止 DDL 冲突
2.3 锁模式
| 模式 | 描述 | 缩写 |
|---|---|---|
| 1 | Null | N |
| 2 | Row Share | RS |
| 3 | Row Exclusive | RX |
| 4 | Share | S |
| 5 | Share Row Exclusive | SRX |
| 6 | Exclusive | X |
3. 锁兼容
| 锁 | RS | RX | S | SRX | X |
|---|---|---|---|---|---|
| RS | Y | Y | Y | Y | N |
| RX | Y | Y | N | N | N |
| S | Y | N | Y | N | N |
| SRX | Y | N | N | N | N |
| X | N | N | N | N | N |
4. 行锁
4.1 获取
UPDATE employees SET salary = 5000 WHERE id = 100;
-- 行级 TX 锁
4.2 ITL
- Interested Transaction List
- 块上记录事务
- INITRANS / MAXTRANS
4.3 阻塞
SELECT
blocking_session, session_id, sql_id
FROM v$session
WHERE blocking_session IS NOT NULL;
5. 表锁
5.1 隐式
INSERT INTO employees ...;
-- RX 锁
5.2 显式
LOCK TABLE employees IN EXCLUSIVE MODE;
LOCK TABLE employees IN ROW SHARE MODE;
LOCK TABLE employees IN SHARE MODE;
6. 死锁
6.1 检测
ORA-00060: deadlock detected
6.2 分析
# trace 文件
$ORACLE_BASE/diag/rdbms/.../trace/*_ora_*.trc
6.3 处理
- 自动回滚一条
- 调整事务顺序
- 缩短事务
详细见:Oracle 事务与锁机制。
7. Latch
7.1 概念
- 轻量锁
- 内存结构保护
- 短期
- 排队
7.2 类型
- 共享
- 排他
7.3 常见
- shared pool latch
- library cache latch
- cache buffers chains latch
详细见:Oracle 闩锁与 Mutex。
8. Mutex
8.1 概念
- Mutual Exclusion
- 替代部分 Latch
- 更轻量
8.2 应用
- Library Cache
- Cursor Pin
9. 锁等待
9.1 查看阻塞
SELECT
s.sid blocker, s.username blocker_user, s.program,
w.sid waiter, w.username waiter_user
FROM v$lock l1, v$session s, v$lock l2, v$session w
WHERE l1.block = 1 AND l2.request > 0
AND l1.id1 = l2.id1 AND l1.id2 = l2.id2
AND l1.sid = s.sid AND l2.sid = w.sid;
9.2 等待事件
- enq: TX - row lock contention
- enq: TM - contention
- library cache lock
- library cache pin
详细见:Oracle 锁等待诊断。
10. 死锁分析
10.1 trace
Deadlock graph:
------------Blocker(s)----------- ------------Waiter(s)------------
Resource Name process session holds waits process session holds waits
TX-00010006-0000abcd 12 8 X 15 10 S
TX-00020008-0000ef01 15 10 X 12 8 S
10.2 解释
- Session 8 持有 TX 等待 Session 10
- Session 10 持有 TX 等待 Session 8
- 循环 = 死锁
11. 事务隔离
11.1 Read Committed(默认)
- 读已提交
- 不可重复读
- 不幻读(行锁)
11.2 Serializable
- 完全隔离
- 可能 ORA-08177
11.3 Read Only
- 只读
- 一致性
12. 多版本并发
12.1 Read Consistency
- 查询看到一致快照
- Undo 重建前镜像
12.2 优势
- 读不阻塞写
- 写不阻塞读
- 并发高
详细见:Oracle-Undo深度解析。
13. 加锁策略
13.1 SELECT FOR UPDATE
SELECT * FROM employees WHERE id = 100 FOR UPDATE;
SELECT * FROM employees WHERE id = 100 FOR UPDATE NOWAIT;
SELECT * FROM employees WHERE id = 100 FOR UPDATE WAIT 10;
SELECT * FROM employees WHERE id = 100 FOR UPDATE SKIP LOCKED;
13.2 LOCK TABLE
LOCK TABLE employees IN EXCLUSIVE MODE;
14. 监控
14.1 v$lock
SELECT
sid, type, id1, id2, lmode, request, block
FROM v$lock
WHERE type IN ('TM', 'TX');
14.2 v$session
SELECT
sid, serial#, username, row_wait_obj#, row_wait_row#
FROM v$session
WHERE username IS NOT NULL;
14.3 dba_blockers / dba_waiters
SELECT * FROM dba_blockers;
SELECT * FROM dba_waiters;
15. 常见坑与排错
15.1 ORA-00060 死锁
- 调整事务顺序
- 缩短事务
- 增大 ITL
15.2 ORA-00054 资源忙
- 锁等待
- NOWAIT
- FOR UPDATE
15.3 ORA-08177 序列化失败
- 串行化冲突
- 重试
- 改 Read Committed
16. 最佳实践
- 小事务:减少锁时间
- 绑定变量:减少 Latch
- FOR UPDATE 谨慎:业务必要
- NOWAIT/WAIT:避免阻塞
- SKIP LOCKED:队列
- ITL 足够:高并发
- 监控锁等待:及时
- 死锁分析:根因
- 事务顺序一致:避免
- 文档化:策略
17. 参考资料
[1] Oracle Database Concepts 19c, “Locks” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/data-concurrency-and-consistency.html