OceanBase 的 MVCC 实现中,同一行数据的多个版本是“原地修改”还是“新增代替修改”?这对于读取路径有什么影响?

OceanBase 的 MVCC 实现中,同一行数据的多个版本是“原地修改”还是“新增代替修改”?这对读取路径有什么影响?

1 个赞

这些问题你直接at 论坛小助手 就可以

@论坛小助手

根据文档库中的信息,OceanBase 数据库的 MVCC(多版本并发控制)实现中,并不是采用“原地修改”的方式来更新数据。而是每当发生对同一行数据的修改时,系统会创建一个新的版本以代替旧版本的数据。这种方法确保了读取操作能够通过访问特定时间点的一致性快照来获取到该时刻下有效的数据视图,而不需要等待任何正在执行的写入操作完成,因此极大地提升了数据库在高并发环境下的性能。

对读取路径的影响

  1. 提高了并发度:由于读取请求不再需要被锁定或等待当前正在进行的写入事务释放锁,因此可以并行处理更多的读取请求。
  2. 支持一致性快照读:允许读取者选择一个历史版本作为其查询的基础,这样即便是在有大量写入活动的情况下也能保证看到一致性的数据状态。
  3. 降低了阻塞概率:减少了因写入引起的读取延迟,尤其是在存在长运行事务场景下更为明显。
  4. 简化了锁管理:除了某些特殊情况如SELECT ... FOR UPDATE外,普通的读取操作不会持有任何类型的锁,这不仅简化了锁的实现逻辑也避免了复杂的锁争用情况。

综上所述,OceanBase 采用新增代替修改的方式来维护不同版本的数据项,这对提高系统的并发能力和响应速度有着显著的帮助。

具体信息可参考以下文档:

  1. 锁机制
  2. 多版本读一致性
  3. 列存 FAQ
  4. obcdc 支持增量旁路导入
  5. 锁定查询结果 SELECT FOR UPDATE
  6. 复制表
  7. undo_retention
  8. 更改表

OB的MVCC多版本并发控制通过为每个事务分配一个唯一的事务ID,并在每个事务访问或修改数据时,根据数据的版本号和事务的启动时间来控制并发访问。
当一个事务修改某个数据时,系统会为该数据创建一个新版本,并将修改
后的数据存储在新的位置,同时保留旧版本的数据供其他事务访问。
当一个事务要访问某个数据时,系统会检查该数据的版本号和事务的启动
时间,以确保该事务可以访问到正确的数据版本。