Oracle 事务管理与并发控制

Oracle 事务管理与并发控制

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

事务管理与并发控制[1]:

ACID

  • Atomicity 原子性
  • Consistency 一致性
  • Isolation 隔离性
  • Durability 持久性

详细见:Oracle 事务与锁机制


2. 事务基础

2.1 开始

-- 隐式开始
INSERT INTO t VALUES (1);

2.2 提交

COMMIT;

2.3 回滚

ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;

2.4 Savepoint

SAVEPOINT sp1;
INSERT ...
SAVEPOINT sp2;
INSERT ...
ROLLBACK TO sp1;

3. 隔离级别

3.1 Read Committed(默认)

-- 默认
-- 读已提交,不可重复读
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

3.2 Serializable

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 完全隔离,可能 ORA-08177

3.3 Read Only

SET TRANSACTION READ ONLY;
-- 只读

4. 锁类型

4.1 DML 锁

  • TM(表锁)
  • TX(行锁)

4.2 DDL 锁

  • 排他
  • 共享
  • 可中断

4.3 闩锁与 Mutex

  • Latch
  • Mutex

详细见:Oracle 闩锁与 Mutex


5. 行锁(TX)

5.1 加锁

-- 自动
UPDATE employees SET salary = 5000 WHERE id = 100;
-- 行级锁

5.2 查看

SELECT 
  s.sid, s.serial#, s.username,
  l.type, l.id1, l.id2, l.lmode, l.request
FROM v$lock l, v$session s
WHERE l.sid = s.sid AND l.type = 'TX';

5.3 阻塞

SELECT 
  blocking_session, session_id, sql_id, 
  blocking_session_status
FROM v$session
WHERE blocking_session IS NOT NULL;

6. 表锁(TM)

6.1 加锁

-- 隐式
INSERT INTO employees ...;
-- 表级 TM 锁

-- 显式
LOCK TABLE employees IN ROW EXCLUSIVE MODE;
LOCK TABLE employees IN EXCLUSIVE MODE;

6.2 锁模式

模式描述
RSRow Share
RXRow Exclusive
SShare
SRXShare Row Exclusive
XExclusive

7. 死锁

7.1 检测

ORA-00060: deadlock detected

7.2 分析

# trace 文件
$ORACLE_BASE/diag/rdbms/.../trace/*_ora_*.trc

7.3 处理

- 自动回滚一条
- 调整事务顺序
- 减少事务时间

详细见:Oracle 事务与锁机制


8. 多版本并发

8.1 Read Consistency

-- 查询看到一致快照
SELECT * FROM employees;
-- 始终一致

8.2 UNDO

-- 前镜像
SELECT tablespace_name, bytes/1024/1024 FROM dba_data_files 
WHERE tablespace_name LIKE 'UNDO%';

详细见:Oracle Undo 表空间管理


9. 闪回查询

-- AS OF
SELECT * FROM employees 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);

-- VERSIONS
SELECT versions_xid, versions_starttime, salary
FROM employees VERSIONS BETWEEN TIMESTAMP 
  (SYSTIMESTAMP - INTERVAL '1' HOUR) AND SYSTIMESTAMP
WHERE id = 100;

详细见:Oracle 闪回技术


10. 自动提交

10.1 DDL

-- DDL 自动提交
CREATE TABLE t (...);
-- 隐式 COMMIT

10.2 应用

- JDBC setAutoCommit(false)
- 批量提交
- 控制频率

11. 分布式事务

11.1 两阶段提交

1. PREPARE
2. COMMIT

11.2 处理

-- 悬挂事务
SELECT * FROM dba_2pc_pending;

-- 强制提交
COMMIT FORCE 'local_tran_id', 'scn';
-- 强制回滚
ROLLBACK FORCE 'local_tran_id';

12. 监控

12.1 长事务

SELECT 
  s.sid, s.serial#, s.username, s.status,
  t.start_time, t.used_ublk
FROM v$session s, v$transaction t
WHERE s.taddr = t.addr
ORDER BY t.start_time;

12.2 锁等待

SELECT 
  s.sid blocker, s.username blocker_user,
  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;

详细见:Oracle 锁等待诊断


13. 常见坑与排错

13.1 ORA-00060 死锁

- 调整事务顺序
- 减少事务时间
- 增大 ITL

13.2 ORA-01555

- UNDO 不足
- 查询太长
- 增大 UNDO

详细见:Oracle Undo 表空间管理

13.3 锁等待

-- 1. 找阻塞源
-- 2. KILL
ALTER SYSTEM KILL SESSION 'sid,serial#';

14. 最佳实践

  1. 小事务:短时间
  2. 绑定变量:减少解析
  3. 批量提交:平衡
  4. 避免长查询:ORA-01555
  5. Read Committed 默认:性能
  6. 死锁处理:顺序
  7. UNDO 充足:避免 ORA-01555
  8. 监控锁等待:及时
  9. 业务设计:避免冲突
  10. 测试:并发

15. 参考资料

[1] Oracle Database Concepts 19c, “Transactions” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/transactions.html