SQL 读一致性学习笔记
读一致性是数据库管理系统中的一个重要特性,确保在并发环境下,用户可以看到一致的数据视图。
1. 读一致性的概念
(1)什么是读一致性?
- 定义:读一致性确保在一个事务中,用户看到的数据是一致的,即使其他事务正在修改数据。
- 实现方式:通过多版本并发控制(MVCC)和回滚段(Undo Segment)实现。
(2)读一致性的作用
- 防止“脏读”:用户不会看到未提交的数据。
- 提供一致的数据视图:用户看到的数据是基于事务开始时的状态。
2. 读一致性的实现
(1)SCN(System Change Number)
- 定义:SCN 是 Oracle 数据库中的一个时间戳,用于标识数据库的某个状态。
- 作用:每个事务都有一个 SCN,用于确定数据的一致性视图。
(2)回滚段(Undo Segment)
- 定义:回滚段用于存储数据的旧版本,以便在需要时回滚或提供一致性视图。
- 作用:当用户查询数据时,如果数据已被修改,Oracle 会从回滚段中获取旧版本的数据。
3. 读一致性的示例
(1)用户 A 的查询
- 场景:
- 用户 A 开始查询,SCN = 1000。
- 查询需要 15 分钟完成。
- 在查询过程中,用户 B 修改了数据。
(2)用户 B 的修改
1 2
| UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769;
|
- 场景:
- 用户 B 在用户 A 查询的第 10 分钟修改了数据。
- 修改后的数据 SCN = 1001。
(3)用户 A 的查询结果
- 结果:
- 用户 A 的查询结果基于 SCN = 1000 的数据状态。
- 即使数据已被修改,用户 A 仍然看到修改前的数据。
4. 如何实现读一致性?
(1)SCN 和回滚段的作用
- 用户 A 的查询开始时,SCN = 1000。
- 如果用户 B 修改了数据,Oracle 会将修改前的数据存储在回滚段中。
- 用户 A 的查询会从回滚段中获取 SCN = 1000 的数据。
(2)示例
1 2 3 4 5 6 7 8
| SELECT current_scn FROM v$database;
UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769;
SELECT * FROM t_bank;
|
5. 脏数据的概念
(1)什么是脏数据?
- 定义:脏数据是指已被修改但未提交的数据。
- 影响:在未提交之前,其他用户无法看到脏数据。
(2)示例
1 2 3 4 5
| UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769;
SELECT * FROM t_bank;
|
6. 总结
- 读一致性的概念:确保用户看到的数据是一致的。
- SCN 的作用:标识数据库的某个状态。
- 回滚段的作用:存储数据的旧版本,用于提供一致性视图。
- 脏数据的概念:已被修改但未提交的数据。