=^^=
下面是《榴芒客服系统》的介绍,欢迎下载试用:
https://blog.csdn.net/look4liming/article/details/164755808
版权声明:本文为CSDN博主「滕州市燕猫虎计算机科技工作室个体工商户」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/look4liming/article/details/168133175
MVCC是InnoDB实现高并发读写、支撑"读已提交"和"可重复读"隔离级别的核心机制。它让普通的SELECT查询无需加锁就能读取到一致性快照,从而避免读写互相阻塞。
核心原理:三个隐藏字段与版本链
InnoDB在每一行数据背后都维护了三个隐藏字段:、
1、DB_TRX_ID(6字节):记录最近一次插入或更新该行的事务ID。
2、DB_ROLL_PTR(7字节):回滚指针,指向Undo Log中该行的上一个历史版本。
3、DB_ROW_ID(6字节):隐藏行ID,仅在表没有主键时作为聚簇索引使用。
每次对行进行更新时,旧数据会被写入Undo Log,并通过回滚指针串联起来,形成一条版本链。链头是最新数据,链尾是最旧的历史数据。
如何判断该看哪个版本:ReadView有了版本链,事务在查询时需要知道哪个版本对自己是"可见"的。这由ReadView(读视图)决定。ReadView主要包含当前系统中活跃(未提交)事务的ID列表等信息。
可见性判断规则(简化版):
1、当查询遍历版本链时,取出版本对应的DB_TRX_ID:
2、如果等于当前事务自己的ID,可见(自己改的自己能看见)。
3、如果小于ReadView中的最小活跃事务ID,说明该版本在快照生成前已提交,可见。
4、如果在活跃事务列表中,说明修改它的事务还没提交,不可见,顺着指针找上一个版本。
5、如果大于最大事务ID,说明是快照生成后才开启的事务修改的,不可见。
隔离级别下的差异,MVCC在不同隔离级别下的核心区别在于ReadView生成的时机:
·
读提交(RC):每次执行SELECT时都生成新的ReadView。因此,你能看到其他事务在本次查询前刚刚提交的数据(可能导致不可重复读)。
可重复读(RR):只在第一次执行SELECT时生成ReadView,整个事务期间复用。因此,无论其他事务何时提交,你看到的始终是第一次查询时的快照(保证了可重复读)。
·
补充说明:
·
快照读vs当前读:普通的SELECT是快照读(走MVCC)。而UPDATE、DELETE、SELECT...FOR UPDATE等是当前读,读取最新数据并加锁,不走MVCC的可见性判断。
清理机制:旧版本由后台的Purge线程清理。如果存在长事务一直不提交,导致ReadView一直不释放,Undo Log就无法被清理,可能会撑大表空间。