cleanout:
- 设置csc
- 释放空间
csc:进行Cleanout时的snapSCN。理解CSC的含义对理解整个多版本协议至关重要:
- 当前页面上所有的活跃ITS(包括FastCleanout在内)的提交SCN一定大于CSC;
- 当前页面上所有大于CSC的事务所做的更新都仍然处于“活跃的”状态,
- 项目录未被重用
- 空间未被回收
- 当前页面上所有小于CSC的事务所做的更新都已丢失。
- its被重用后的可见性判断
- 消耗空间时,判断空闲空间是否可用,7K/8K问题
获取CR页面时:
- 只读事务只要CR_SCN满足条件
- 如果是之前的CR页面有当前事务构造,则判断ula是否满足要求,满足则可使用,否则无法使用。本事务的更新已经被回滚
- 如果仅回滚了一个活跃事务,而且回滚的不是当前事务,则可直接使用,否则无法使用。本事务可能被回滚了。
control scn:最近被重用事务槽的提交scn
- 回滚事务表前,先判断control scn,因为其为所有被重用事务槽提交scn的上线
snapshot too old:
- 获取行的事务状态时,如果lock指针失效,当前scn小于csc
- 如果事务状态为upper bound,当前scn小于upper bound scn
- 如果undo block被重用,则无法回滚。
串行化错误:
- 更新行的its已经被重用或者需要消耗空间时,而且当前事务snapshot_scn小于csc时,无法判断可见性。
- 更新行的commit scn大于当前snapshot scn
- 更新行的upper bound scn大于当前snapshot scn
Oracle CR页面的优势:加锁时,如果当前页面持有S锁,则直接clone,而不用等待锁释放
- 扫描过程中可长期持有S锁,避免扫描过程中频繁Latch页面或者构造CR页面
- 回刷页面时可持有S锁,避免回刷页面时的copy或者等待
- 索引扫描与SMO可并行化