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 锁模式

模式描述缩写
1NullN
2Row ShareRS
3Row ExclusiveRX
4ShareS
5Share Row ExclusiveSRX
6ExclusiveX

3. 锁兼容

RSRXSSRXX
RSYYYYN
RXYYNNN
SYNYNN
SRXYNNNN
XNNNNN

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