Undo Log

用于保证事务的原子性, 每一个修改操作(无论事务是否提交), MySQL都会写一条Undo Log日志, 用于回滚
MVCC - 图1

Read View

可以理解为一种可见性算法, 用于判断当前事务对某条记录的某个版本是否可见
Read View中有3个非常重要的属性, 用java代码演示一下

  1. @Data
  2. public class ReadView {
  3. /**
  4. * 用于维护Read View生成时刻, 系统正活跃的事务ID列表
  5. */
  6. private List<Long> trx_id_list;
  7. /**
  8. * 是trx_id_list列表中的最小值
  9. */
  10. private Long min_trx_id;
  11. /**
  12. * Read View生成时刻, 系统尚未分配的下一个事务ID, 也就是目前已出现过的事务ID的最大值 + 1
  13. */
  14. private Long max_trx_id;
  15. }

然后根据min_trx_id和max_trx_id划分出3个区间
MVCC - 图2
Undo Log中的版本可见性规则: 对已提交的事务可见, 对未提交的事务不可见

  • trx ∈ (-∞, min_trx_id) 可见
  • trx ∈ [max_trx_id, +∞) 不可见
  • trx ∈ [min_trx_id, max_trx_id)
    • trx ∈ trx_id_list 不可见
    • trx ∉ trx_id_list 可见