数据库隔离级别与Read View(快照)机制笔记

一、SQL Server、Oracle、MySQL 的 Read Committed 实现机制对比

数据库Read Committed 实现方式是否加锁是否使用快照特点说明
SQL Server使用共享锁(S 锁)读提交版本✅ 是❌ 默认不使用快照(除非启用 snapshot isolation)读时阻塞写,写也会阻塞读;性能一般
Oracle使用 MVCC,多版本机制❌ 否✅ 默认使用一致性读使用 undo 实现快照读,不加锁,性能高
MySQL(InnoDB)使用 MVCC + undo log + Read View❌ 否✅ 默认使用快照读默认读已提交时快照每次创建一次;性能高

🔑 关键词:

  • SQL Server 默认靠锁保证一致性;
  • Oracle 和 MySQL 默认使用多版本快照(MVCC)机制;
  • MySQL 和 Oracle 在 Read Committed 下就使用快照,只是快照作用范围不同。

二、MySQL 和 Oracle 中 Read Committed 与 Repeatable Read 快照机制对比

📌 关键区别

特性Read CommittedRepeatable Read
快照生成时机每次查询前生成新的 Read View第一次快照读时生成并复用
快照作用范围语句级一致性事务级一致性
是否可重复读❌ 否(数据可能变化)✅ 是(数据固定)
幻读可能出现InnoDB 会通过 next-key lock 避免
一致性强度较弱(语句级)强(事务级)

🧪 举例说明(MySQL InnoDB)

情况一:Read Committed

-- 事务 A:
BEGIN;
UPDATE user SET name = 'Bob' WHERE id = 1;
-- 未提交

-- 事务 B:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN;
SELECT name FROM user WHERE id = 1;  -- 第一次查询,生成快照A → 返回 'Alice'
-- 事务 A 提交
SELECT name FROM user WHERE id = 1;  -- 第二次查询,生成快照B → 返回 'Bob'

✔ 每次读都生成快照,看的是“当前已提交的版本”。

情况二:Repeatable Read

-- 事务 A:
BEGIN;
UPDATE user SET name = 'Bob' WHERE id = 1;
-- 未提交

-- 事务 B:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN;
SELECT name FROM user WHERE id = 1;  -- 第一次查询,生成快照A → 返回 'Alice'
-- 事务 A 提交
SELECT name FROM user WHERE id = 1;  -- 复用快照A → 仍然返回 'Alice'

✔ 整个事务期间快照不变,确保可重复读。

三、MySQL 中 Read View(快照)生成时机与过程

✅ 快照什么时候生成?

  • 在执行第一次需要快照读的语句(在SELECT语句之前就生成了)之前生成。
  • Read Committed:每次读前都重新生成快照;
  • Repeatable Read:首次 SELECT 时生成一次快照,整个事务复用。

📦 Read View 包含哪些内容?

字段说明
m_ids[]当前活跃的未提交事务 ID
min_trx_id活跃事务中最小的事务 ID
max_trx_id当前系统中尚未分配的下一个事务 ID
creator_trx_id当前执行 SELECT 的事务 ID

🧠 快照如何判断一行数据是否可见?

每条记录有一个 trx_id(最后修改它的事务 ID):

IF (
  trx_id < min_trx_id
  AND trx_id ≠ 当前事务 ID
  AND trx_id ∉ m_ids[]
)
THEN 可见 ✅
ELSE 不可见 ❌
  • 如果该版本由老事务提交 → ✅ 可见
  • 如果由活跃事务创建、或未提交 → ❌ 不可见

🪜 快照生成过程简述

  1. 当前事务执行 SELECT,InnoDB 检查是否需要生成 Read View;
  2. 从事务系统中读取当前活跃事务列表(m_ids);
  3. 记录当前事务的 ID 与最小事务 ID;
  4. 使用这些信息生成 Read View(快照);
  5. 对每条记录,根据版本链 + Read View 决定是否可见。

🔁 补充:快照读 vs 当前读

类型是否走快照是否加锁示例
快照读(snapshot read)✅ 是❌ 否SELECT ...
当前读(current read)❌ 否✅ 是SELECT ... FOR UPDATEUPDATEDELETE

✅ 总结关键点

  1. Read Committed:每次读生成快照,读已提交版本,语句级一致性,不可重复读。
  2. Repeatable Read:第一次读生成快照,事务级一致性,可重复读。
  3. 快照 ≠ 数据拷贝,是通过 Read View + undo log 实现的视图控制。
  4. 快照是在 SELECT 等语句执行前生成,用于控制 MVCC 可见性。
  5. SQL Server 用加锁实现一致性;MySQL/Oracle 用快照机制;性能差异明显。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流永不粹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值