怎么分别快照读和当前读、有点搞混了

怎么分别快照读和当前读、有点搞混了

1 个赞

在 OceanBase(以及 MySQL 等主流关系型数据库)中,快照读和当前读是两种不同的数据读取机制。它们的核心区别在于是否加锁读取的数据版本以及对并发事务的影响

以下是它们的详细对比:

1. 快照读 (Snapshot Read)

  • 定义:读取的是数据的“历史快照”版本,而不是最新的数据。
  • 触发条件:普通的 SELECT 查询语句。
  • 是否加锁不加任何锁
  • 底层原理:基于 MVCC(多版本并发控制)机制实现。系统会根据当前事务的启动时间或读取时间点,去 Undo Log(回滚日志)中寻找并构建该时刻可见的历史版本数据。
  • 并发特性:读写互不阻塞。它既不会阻塞其他事务对数据的写入/更新,也不会被其他事务的写操作所阻塞。

2. 当前读 (Current Read)

  • 定义:读取数据库中最新提交的数据,并且为了保证数据的一致性,必须对读取的记录进行锁定。
  • 触发条件
    • 显式的加锁查询:如 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE
    • 所有的修改操作:如 INSERTUPDATEDELETE
  • 是否加锁会加锁。根据操作类型不同,可能会加上排他锁(X锁)、共享锁(S锁)或意向锁等。
  • 底层原理:直接访问存储引擎中的最新物理记录,并通过锁机制来保证读取期间数据不被其他事务修改。
  • 并发特性:存在锁竞争。如果目标数据已经被其他事务锁定,当前读会被阻塞等待;同时,它也会阻塞其他试图修改该数据的写事务。

总结

简单来说,快照读是为了“高并发”而生,不加锁、看旧版本;当前读是为了“强一致性”而生,必加锁、看最新版本。

1 个赞