面试题答案
一键面试数据行可见性判断及关键因素
- 事务ID(XID)
- 创建事务ID(xmin):每一个数据行都有一个创建事务ID(xmin),它标识了插入该行数据的事务ID。如果当前事务的ID大于或等于xmin,且xmin对应的事务没有被回滚(通过事务状态信息判断),则该行数据有可能对当前事务可见。
- 删除事务ID(xmax):数据行还有一个删除事务ID(xmax),如果xmax为0,表示该行未被删除。若xmax不为0且对应事务已提交,那么该行数据对当前事务不可见;若xmax对应事务未提交或已回滚,需进一步判断。
- 事务状态
- 提交状态:对于xmin对应的事务,若已提交,该行数据可能可见(还要结合其他条件);若未提交,仅当当前事务与创建该数据行的事务是同一个事务时可见,否则不可见。对于xmax对应的事务,已提交则数据行不可见,未提交或回滚时需综合其他因素判断。
- 快照(Snapshot)
- 快照内容:事务在启动时会获取一个快照,快照记录了当前活跃事务的ID集合。如果xmin不在快照的活跃事务ID集合中,且xmin对应的事务已提交,那么该行数据对当前事务可见;若xmin在活跃事务ID集合中,说明创建该行数据的事务在当前事务启动时仍未提交,仅当当前事务与创建事务为同一事务时可见。对于xmax,如果xmax在快照活跃事务ID集合中且不为0,说明删除该行数据的事务在当前事务启动时未提交,此时该行数据对当前事务可见(因为删除操作未生效)。