b+
落盘的b+树(二)
事务 之前的b+树,并没有满足一致性的需求(或者说原子性), 因为涉及到写操作的时候,牵扯多了多个节点变更,如果出现其中一个节点写出现问题,整体上就没有办法恢复了. 所以加了一个分支,实现了出现部分写入问题,可以进行回滚. 解决 需要解决这种问题,目前必须采用double write,就是提前讲数据落在别的地方,等出现问题的时候能够从别处恢复 整体上记住一件事,出现double write的场景都是因为写是inplace update而不是append only redo/undo 例如mysql中innodb的undo和redo 都知道undo记录原始数据的值,本质上是逻辑日志(面向tuple记录) undo是保证原子性(另一个作用是为了mysql的快照读这种黑科技,mvcc) 而redo记录事务中数据变化后的数据,本质上是物理逻辑日志日志(面向page页,physical-to-a-page, logical-within-a-page),更像是"残缺"的快照 说残缺是因为如果快照下全部页的占用空间成本太高了,通常不会全部记录