用户commit了,数据就不能丢
rollback,就必须没有
undo撤销
redo 重干
shadow paging
我要修改的的东西,我先另起一页
commit的时候要刷,指针要改,垃圾要清理
sqlite对于shadowpage的优化,日志中放原始页
WAL
预写日志
先把日志刷到磁盘里,再刷数据
用户commit,保证日志已经刷进去了
日志长什么样
断电了
扫描磁盘日志
优化
commit的时候必须刷日志,但也挺麻烦,频繁IO,通过组提交
多攒几个commit,一起提交
物理日志
每个页二进制数据偏移的变化
缺点:比如update 所有人的号
逻辑日志
用户发的sql语句
缺点:用户想发一个now,或者limit,是随机的
数据什么时候刷盘
自己理解,物理日志把redo和undo写了一起了
checkpoints
redo和undo是一个操作
redo就是数据没刷到磁盘上,但日志刷上去了,断电了
undo就是干一半断电了。就想上面图中T3要干的事儿
这些操作可以用所谓的物理日志,逻辑日志去实现