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. 最佳实践

  1. 小事务:减少锁时间
  2. 绑定变量:减少 Latch
  3. FOR UPDATE 谨慎:业务必要
  4. NOWAIT/WAIT:避免阻塞
  5. SKIP LOCKED:队列
  6. ITL 足够:高并发
  7. 监控锁等待:及时
  8. 死锁分析:根因
  9. 事务顺序一致:避免
  10. 文档化:策略

17. 参考资料

[1] Oracle Database Concepts 19c, “Locks”
https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/data-concurrency-and-consistency.html