Oracle 事务 ACID 深度解析
Oracle 事务 ACID 深度解析
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
ACID 是事务核心特性[1]:
- Atomicity 原子性
- Consistency 一致性
- Isolation 隔离性
- Durability 持久性
详细见:Oracle 事务与锁机制。
2. Atomicity 原子性
2.1 概念
- 事务不可分割
- 全部成功或全部失败
- 原子单元
2.2 实现
BEGIN
INSERT INTO accounts ...;
UPDATE accounts ...;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
RAISE;
END;
/
2.3 Savepoint
SAVEPOINT sp1;
INSERT ...
SAVEPOINT sp2;
UPDATE ...
ROLLBACK TO sp1;
-- sp1 后操作回滚
3. Consistency 一致性
3.1 概念
- 事务前后一致
- 约束保持
- 业务规则
3.2 实现
- 约束(PK/FK/UNIQUE/CHECK/NOT NULL)
- 触发器
- 应用逻辑
3.3 示例
-- 转账
BEGIN
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
-- 检查约束
-- balance >= 0
COMMIT;
END;
/
4. Isolation 隔离性
4.1 隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| Read Uncommitted | 可能 | 可能 | 可能 |
| Read Committed | 否 | 可能 | 可能 |
| Repeatable Read | 否 | 否 | 可能 |
| Serializable | 否 | 否 | 否 |
4.2 Oracle 隔离
- Read Committed(默认)
- Serializable
- Read Only
4.3 设置
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;
5. Durability 持久性
5.1 概念
- 提交后永久
- 故障不丢失
- Redo 日志
5.2 实现
- LGWR 写 Redo
- COMMIT 同步
- Redo Log File
- 归档
5.3 FAST COMMIT
- 提交立即返回
- 数据异步写
- Redo 已保证
6. Oracle ACID 实现
6.1 A - Undo
- Undo 记录前镜像
- ROLLBACK 应用
6.2 C - 约束 + 应用
- 约束保证
- 业务规则
6.3 I - 多版本并发
- Read Consistency
- Undo 重建前镜像
- 读不阻塞写
6.4 D - Redo
- Redo 记录变更
- LGWR 写盘
- 提交确认
7. 事务控制
7.1 开始
- 隐式
- 第一个 DML
- DDL 自动提交前事务
7.2 提交
COMMIT;
COMMIT WORK;
COMMIT WRITE BATCH; -- 异步
COMMIT WRITE IMMEDIATE; -- 同步
7.3 回滚
ROLLBACK;
ROLLBACK TO SAVEPOINT sp1;
8. 分布式事务
8.1 两阶段提交
1. PREPARE:所有节点准备
2. COMMIT:所有节点提交
8.2 处理
-- 悬挂事务
SELECT * FROM dba_2pc_pending;
-- 强制
COMMIT FORCE 'local_tran_id';
ROLLBACK FORCE 'local_tran_id';
9. 多版本并发
9.1 Read Consistency
- 查询一致快照
- 块 SCN > 查询 SCN
- Undo 重建
9.2 优势
- 读不阻塞写
- 写不阻塞读
- 高并发
详细见:Oracle-Undo深度解析。
10. 闪回查询
10.1 AS OF
SELECT * FROM employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' HOUR);
10.2 VERSIONS
SELECT versions_xid, versions_starttime, salary
FROM employees
VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '1' HOUR) AND SYSTIMESTAMP;
详细见:Oracle 闪回技术。
11. 并发问题
11.1 脏读
- Read Uncommitted
- Oracle 不允许
11.2 不可重复读
- Read Committed
- 同事务两次读不同
11.3 幻读
- 范围查询
- 新增/删除
- Serializable 防止
12. 锁与隔离
12.1 行锁
- TX
- 事务级
- 防止并发修改
12.2 表锁
- TM
- 防止 DDL
详细见:Oracle 锁机制深度解析。
13. 事务监控
13.1 v$transaction
SELECT
addr, xid, status, start_time,
used_ublk, used_urec
FROM v$transaction;
13.2 v$session
SELECT
sid, serial#, username, taddr
FROM v$session
WHERE taddr IS NOT NULL;
13.3 长事务
SELECT
s.sid, s.serial#, s.username,
t.start_time, t.used_ublk
FROM v$session s, v$transaction t
WHERE s.taddr = t.addr
ORDER BY t.start_time;
14. 最佳实践
14.1 小事务
- 短时间
- 减少锁
- 高并发
14.2 批量提交
- 平衡性能
- 1000-10000
14.3 异常处理
- ROLLBACK
- SAVEPOINT
- RAISE
15. 常见坑与排错
15.1 ORA-08177
- 串行化失败
- 重试
- 改 Read Committed
15.2 长事务
- ORA-01555
- UNDO 满
- 拆分事务
15.3 死锁
- ORA-00060
- 事务顺序
16. 最佳实践
- 小事务:性能
- 绑定变量:减少 Latch
- 异常处理:完整
- Read Committed 默认:平衡
- UNDO 充足:闪回
- 监控长事务:及时
- 批量提交:平衡
- 测试并发:质量
- 业务规则一致:正确
- 文档化:设计
17. 参考资料
[1] Oracle Database Concepts 19c, “Transactions” https://docs.oracle.com/en/database/oracle/oracle-database/19/cncpt/transactions.html