1.数据行里的三个字段

  • DB_TRX_ID 最后一次修改本行记录的事务id
  • DB_ROLL_PTR** ** 回滚指针,指写入回滚段的undo日志记录
  • DB_ROW_ID** ** 行号,随着一行记录插入而产生的单调递增的序列

image.png

2.undo日志

存储的是老版本的日志,当对记录做了变更操作时,就会产生undo记录。
当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着undo链找到满足其可见性的记录。
undolog分为两种 :

  • update undolog : 事务对记录进行delete或者update产生的undolog,在事务回滚和快照读时都需要,不能随便删除,只有当数据库所使用的的快照中不涉及该日志记录,对应的回滚日志才会被删除
  • insert undolog:事务对记录进行insert产生的undolog,只在事务回滚时需要,在事务提交后可以立即丢弃

    3.read view

  • RR级别: 第一次执行快照读时创建read view(所以RR级别第一次执行快照读的时机特别重要)

  • RC级别:每次调用快照读的时候就会创建新的read view

read view用于可见性判断。执行快照读时会为查询的数据创建出一个read view来决定当前事务看到的是哪个版本的数据。 :::tips read view遵循可见性算法
将要修改的数据的DB_TRX_ID取出来与系统其它活跃事务id作对比,如果大于等于这些id,就通过DB_ROLL_PTR指针取出undolog上一层的DB_TRX_ID** ,直到小于这些活跃事务id为止。这样就保证了我们获取的数据版本是当前可见最稳定的版本**。 :::