SQL 读一致性

SQL 读一致性学习笔记

读一致性是数据库管理系统中的一个重要特性,确保在并发环境下,用户可以看到一致的数据视图。

1. 读一致性的概念

(1)什么是读一致性?

  • 定义:读一致性确保在一个事务中,用户看到的数据是一致的,即使其他事务正在修改数据。
  • 实现方式:通过多版本并发控制(MVCC)和回滚段(Undo Segment)实现。

(2)读一致性的作用

  • 防止“脏读”:用户不会看到未提交的数据。
  • 提供一致的数据视图:用户看到的数据是基于事务开始时的状态。

2. 读一致性的实现

(1)SCN(System Change Number)

  • 定义:SCN 是 Oracle 数据库中的一个时间戳,用于标识数据库的某个状态。
  • 作用:每个事务都有一个 SCN,用于确定数据的一致性视图。

(2)回滚段(Undo Segment)

  • 定义:回滚段用于存储数据的旧版本,以便在需要时回滚或提供一致性视图。
  • 作用:当用户查询数据时,如果数据已被修改,Oracle 会从回滚段中获取旧版本的数据。

3. 读一致性的示例

(1)用户 A 的查询

1
2
-- 用户 A 开始查询
SELECT * FROM t_bank; -- SCN = 1000
  • 场景
    • 用户 A 开始查询,SCN = 1000。
    • 查询需要 15 分钟完成。
    • 在查询过程中,用户 B 修改了数据。

(2)用户 B 的修改

1
2
-- 用户 B 修改数据
UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769; -- SCN = 1001
  • 场景
    • 用户 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
-- 用户 A 查询 SCN
SELECT current_scn FROM v$database; -- 假设 SCN = 1000

-- 用户 B 修改数据
UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769; -- SCN = 1001

-- 用户 A 查询结果
SELECT * FROM t_bank; -- 基于 SCN = 1000 的数据

5. 脏数据的概念

(1)什么是脏数据?

  • 定义:脏数据是指已被修改但未提交的数据。
  • 影响:在未提交之前,其他用户无法看到脏数据。

(2)示例

1
2
3
4
5
-- 用户 B 修改数据(未提交)
UPDATE t_bank SET sal = sal + 1000 WHERE id = 18769;

-- 用户 A 查询数据
SELECT * FROM t_bank; -- 看不到用户 B 的修改

6. 总结

  1. 读一致性的概念:确保用户看到的数据是一致的。
  2. SCN 的作用:标识数据库的某个状态。
  3. 回滚段的作用:存储数据的旧版本,用于提供一致性视图。
  4. 脏数据的概念:已被修改但未提交的数据。

SQL 读一致性
https://blog.pangcy.cn/2018/09/13/数据库相关/Oracle/SQL 语法/SQL 读一致性/
作者
子洋
发布于
2018年9月13日
许可协议