Read View 怎么判断一个版本能不能看
事务拍快照时,InnoDB 记下四个值:
| 字段 | 含义 |
|---|---|
m_ids | 拍快照时还没提交的读写事务 |
min_trx_id | m_ids 里最小的 |
max_trx_id | 下一个要分配的事务 id |
creator_trx_id | 自己 |
读一行时,从最新版本开始,看它的 trx_id:
- 等于
creator_trx_id:自己改的,可见 - 小于
min_trx_id:拍快照前就提交了,可见 - 大于等于
max_trx_id:拍快照后才开始的事务,不可见 - 在中间:查
m_ids,在里面就是当时还没提交,不可见,否则可见
不可见就沿 DB_ROLL_PTR 去 undo 里找上一个版本,直到找到第一个可见的。
RR 整个事务只拍一张快照,RC 每条语句拍一张,可重复读和读已提交的区别就从这里来。