MySql的MVCC多版本控制
undolog:回滚日志(保证一致性)只有在ReadCommited和RepeatableRead隔离级别有用
redolog:重写日志(保证持久性)
示例讲解
ReadCommited隔离级别(4) select1=张三,select2=张小三
RepeatableRead隔离级别(4) select1=张三,select2=张三
其中两个概念:
- ReadView(快照读):select语句,每进行一次select就会触发一次快照生成ReadView,记录m_ids(当前未提交事务)、min_trx_id(当前最小事务号)、max_trx_id(当前最大事务号+1)、creator_trx_id(本事务号)
- 当前读:update、delete、select ..for update、select ..lock share,每修改一次数据,会将日志记录在undolog中,并为修改列添加TRX_ID(事务编号)和ROLL_PTR(指向上一条事务的指针)字段
如上前3次修改就会形成如下版本链,第四个事务的第一次select会触发一次ReadView
版本链数据访问规则
for(当前事务id3,2,1判断){
1.判断当前事务id=creator_trx_id(4)? 成立,说明数据就是本身事务,可以直接访问(break当前事务数据)
2.判断当前事务id<min_trx_id(2)? 成立,说明数据已经提交,可以直接访问(break当前事务数据)
3.判断当前事务id>max_trx_id(5)? 成立,说明该事务在ReadView生成后才启动,不允许访问
4.判断min_trx_id<(2)=当前事务id<=max_trx_id(5)? 成立,查看当前事务是否在m_ids列表不存在数据,则代表已经提交,可以访问(break当前事务数据);ids中存在,则表示事务还未提交,根据指针到下一个事务判断
}
ReadCommited和RepeatableRead的差别是在同一个事务中,ReadCommited的多次select会生成多个ReadView,但RepeatableRead的话只复制第一个ReadView,所以不会出现幻读的问题。但:如果在RR情况下,同一个事务做了update等操作可能也会出现幻读。
标签:事务,redolog,undolog,trx,MVCC,当前,ReadView,id,select From: https://www.cnblogs.com/xin-xing/p/16615395.html