OceanBase数据库中,从Follower副本读取数据时,Follower副本的数据版本需要高于弱一致性读时间戳,其主要目的是:
A. 确保返回的数据满足事务一致点
B. 确保读取到的数据是最新的
C. 确保读取到的数据与Leader副本一致
D. 避免脏读
感觉都不对
应该是a
B. 数据最新性:弱一致性读允许滞后,其核心并非追求“最新”,而是保证一致性
C. 与Leader一致:弱一致性读明确接受副本落后数据,仅保证事务快照一致性,而非实时同步
D. 避免脏读:脏读通常指未提交数据的可见性,而OceanBase的读操作(包括弱一致性读)默认已通过事务隔离级别避免脏读,与时间戳约束无直接关联
正确答案是 A. 确保返回的数据满足事务一致点。这一设计确保即使读取Follower副本的旧数据,结果仍符合事务一致性要求,避免出现逻辑不一致的状态
厉害,学习了
AAAAA
学习了
在OceanBase数据库中,从Follower副本读取数据时,要求Follower副本的数据版本高于弱一致性读时间戳,其主要目的是 避免脏读。
这一机制的核心原理如下:
- 弱一致性读会在执行前确定一个读快照时间戳(Read Snapshot Timestamp),表示希望读取该时刻之前已提交的数据。
- 每个Follower副本会实时维护一个最大安全可读版本号(Max Safe Read Version),表示当前已成功应用的所有事务版本。
- 只有当读快照时间戳 ≤ 最大安全可读版本时,才允许在该副本上执行读操作;否则拒绝或重试其他副本。
这样做是为了保证:
- 所读数据已在该副本上完整落地;
- 不会出现部分事务或未提交事务被读取的情况;
- 维护了基本的事务隔离性,防止脏读(Dirty Read)。
尽管弱一致性读允许一定延迟(例如默认最多5秒),但它仍能提供事务级原子性和一致性,确保不会破坏数据库的ACID语义。
正如文档所述:“不论何种场景,只要读快照小于单个分区维护的最大安全可读版本号,读到的数据一定具备原子性。”
弱一致性读 → 弱一致性读时间戳 → 原子性
因此,正确答案是:D. 避免脏读。
在 OceanBase 数据库中,从 Follower 副本读取数据时,要求 Follower 副本的数据版本需高于弱一致性读时间戳,其主要目的是:
A. 确保返回的数据满足事务一致点
详细解释:
OceanBase 的弱一致性读(WEAK Read)虽不要求读取最新数据,但仍必须保证返回的是一个全局事务一致性点,即不能出现“一半事务”或中间断裂状态(fractured read),也不能读取未提交数据。
为此,系统引入了两个关键机制:
-
读快照时间戳(Read Snapshot Timestamp)
每次弱一致性读请求都会基于当前时间减去允许的最大滞后时间(由参数max_stale_time_for_weak_consistency
控制,默认5秒)生成一个读快照时间戳。 -
最大安全可读位点(Max Safe Read Point)
每个 Follower 副本会实时维护一个“最大安全可读位点”,表示该副本已成功回放的最新日志位置,也即其所能提供的最新数据版本。
只有当 读快照时间戳 ≤ 最大安全可读位点 时,才允许在该 Follower 副本上执行读操作。换句话说,Follower 副本的数据版本必须“足够新”,才能支撑这个一致性快照的构建。
为什么这是为了“确保事务一致点”?
如果允许在一个数据版本低于读快照时间戳的副本上读取数据,意味着该副本尚未回放完对应时间范围内的所有事务日志,可能导致:
- 某些应可见的已提交事务缺失;
- 或者只看到部分更新,形成“断裂读”;
- 无法构造出逻辑上自洽的历史快照。
因此,这一检查的核心目的不是为了获取最新数据,也不是严格对齐 Leader,而是确保即使从副本读取,也能提供一个完整、一致、可验证的事务性视图。
AAAAA
这题有难度
学习了
感谢分享
从感觉上来说是A