怎么分别快照读和当前读、有点搞混了
1 个赞
在 OceanBase(以及 MySQL 等主流关系型数据库)中,快照读和当前读是两种不同的数据读取机制。它们的核心区别在于是否加锁、读取的数据版本以及对并发事务的影响。
以下是它们的详细对比:
1. 快照读 (Snapshot Read)
- 定义:读取的是数据的“历史快照”版本,而不是最新的数据。
-
触发条件:普通的
SELECT查询语句。 - 是否加锁:不加任何锁。
- 底层原理:基于 MVCC(多版本并发控制)机制实现。系统会根据当前事务的启动时间或读取时间点,去 Undo Log(回滚日志)中寻找并构建该时刻可见的历史版本数据。
- 并发特性:读写互不阻塞。它既不会阻塞其他事务对数据的写入/更新,也不会被其他事务的写操作所阻塞。
2. 当前读 (Current Read)
- 定义:读取数据库中最新提交的数据,并且为了保证数据的一致性,必须对读取的记录进行锁定。
-
触发条件:
- 显式的加锁查询:如
SELECT ... FOR UPDATE、SELECT ... LOCK IN SHARE MODE。 - 所有的修改操作:如
INSERT、UPDATE、DELETE。
- 显式的加锁查询:如
- 是否加锁:会加锁。根据操作类型不同,可能会加上排他锁(X锁)、共享锁(S锁)或意向锁等。
- 底层原理:直接访问存储引擎中的最新物理记录,并通过锁机制来保证读取期间数据不被其他事务修改。
- 并发特性:存在锁竞争。如果目标数据已经被其他事务锁定,当前读会被阻塞等待;同时,它也会阻塞其他试图修改该数据的写事务。
总结
简单来说,快照读是为了“高并发”而生,不加锁、看旧版本;当前读是为了“强一致性”而生,必加锁、看最新版本。
1 个赞