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 锁模式
| 模式 | 描述 |
|---|---|
| RS | Row Share |
| RX | Row Exclusive |
| S | Share |
| SRX | Share Row Exclusive |
| X | Exclusive |
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. 最佳实践
- 小事务:短时间
- 绑定变量:减少解析
- 批量提交:平衡
- 避免长查询:ORA-01555
- Read Committed 默认:性能
- 死锁处理:顺序
- UNDO 充足:避免 ORA-01555
- 监控锁等待:及时
- 业务设计:避免冲突
- 测试:并发
15. 参考资料
[1] Oracle Database Concepts 19c, “Transactions” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/transactions.html