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

  1. 小事务:性能
  2. 绑定变量:减少 Latch
  3. 异常处理:完整
  4. Read Committed 默认:平衡
  5. UNDO 充足:闪回
  6. 监控长事务:及时
  7. 批量提交:平衡
  8. 测试并发:质量
  9. 业务规则一致:正确
  10. 文档化:设计

17. 参考资料

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