MySQL MVCC 的快照读和当前读区别
快照读 (Snapshot Read)
- 定义: 读取数据的历史版本(快照),基于 MVCC(多版本并发控制)实现。
- 特点:
- 不加锁,非阻塞读。
- 返回事务开始时的快照数据,确保一致性。
- 依赖 Undo Log 和版本链。
- 适用场景: 普通的 SELECT 查询。
- 示例:
SELECT * FROM user WHERE id = 1;
- 隔离级别: Read Committed(读已提交) 和 Repeatable Read(可重复读) 中常用。
当前读 (Current Read)
- 定义: 读取数据的最新版本,通常涉及加锁。
- 特点:
- 加锁操作,保证数据一致性。
- 返回最新提交的数据。
- 使用行锁、间隙锁等机制。
- 适用场景: 加锁查询或写操作(如 UPDATE、DELETE)。
- 示例:
SELECT * FROM user WHERE id = 1 FOR UPDATE;
UPDATE user SET name = 'Tom' WHERE id = 1;
主要区别
特性 | 快照读 | 当前读 |
---|
数据版本 | 历史快照 | 最新数据 |
是否加锁 | 不加锁 | 加锁 |
实现方式 | MVCC + Undo Log | 锁 + 最新数据 |
示例 | 普通 SELECT | 加锁 SELECT, DML |
Redis RDB + AOF 混合持久化流程
- Redis 在 4.0 版本引入了 RDB 和 AOF 的混合持久化,结合 RDB 的快速恢复和 AOF 的数据完整性。以下是流程:
1. 开启混合持久化
aof-use-rdb-preamble yes
2. 数据写入
- 客户端写命令(如 SET、DEL)被记录到 AOF 缓冲区。
3. 触发重写
- 手动触发: BGREWRITEAOF 命令。
- 自动触发: 根据 AOF 文件大小增长规则。
4. 混合持久化过程
- 生成 RDB 快照:
- 写入 AOF 文件:
- 追加增量命令:
- 子进程生成快照期间,主进程缓冲写命令。
- 快照完成后,将缓冲区的命令以 AOF 格式追加到文件。
- 替换旧文件:
- 新 AOF 文件(RDB + AOF 增量)原子替换旧文件。
5. 数据恢复
- 重启时:
- 加载 AOF 文件中的 RDB 部分,快速恢复内存。
- 执行后续 AOF 命令,补齐增量变更。
配置示例
save 900 1
appendonly yes
aof-use-rdb-preamble yes
优点
- RDB: 文件小,恢复快。
- AOF: 数据丢失少。
- 混合: 兼顾速度和完整性。
总结
- MySQL MVCC:
- Redis 混合持久化:
- RDB 提供初始快照,AOF 追加增量,子进程重写,原子替换。