标签:更改 方式 util create 版本 事务 理解 alt color
参考了以下博文:
https://www.imooc.com/article/17290
https://baijiahao.baidu.com/s?id=1629409989970483292&wfr=spider&for=pc
MVCC(Mutil-Version Concurrency Control),就是多版本并发控制,实现对数据库的并发访问。
单纯加锁:InnoDB是支持行锁的,这也是防止在多线程的情况下造成数据冲突。但是这种方式时低效的,因为当事务A在对某行数据进行修改的时候加的是排他锁,那么事务B要是想读这条数据就会被堵塞,只能等这行数据的锁被释放(就是事务A提交的时候),才能对数据进行访问。但是数据库一般读操作要大于写操作,而有一个写所有的读都会被堵塞,这是很低效的。
解决办法:MVCC在MySQL的实现依赖undo log+read view+排他锁(复制到redo log时用到排他锁)
一. 两个关键
?
二. 如何进行判断
在读某行的时候需要对事务id进行判断,从而决定这行数据:可以返回当结果 / 不可以的话遍历版本链的下一条记录再进行判断
?
三. 不同隔离情况下的under review
?
四. 举个栗子
事务50和60分别对小明这行进行了修改并提交了
1. 此时有一个事务id为100的事务,修改了name,使得的name等于小明2,但是事务还没提交。则此时的版本链是
那此时另一个事务发起了select 语句要查询id为1的记录,那此时生成的ReadView 列表只有[100]。那就去版本链去找了,首先肯定找最近的一条,发现trx_id是100,也就是name为小明2的那条记录,发现在列表内,所以不能访问。
这时候就通过指针继续找下一条,name为小明1的记录,发现trx_id是60,小于列表中的最小id,所以可以访问,直接访问结果为小明1。
2.?这时候我们把事务id为100的事务提交了,并且新建了一个事务id为110也修改id为1的记录,并且不提交事务,则此时的版本链是
这时候之前那个select事务又执行了一次查询,要查询id为1的记录。
关键地方来了:
标签:更改 方式 util create 版本 事务 理解 alt color
原文地址:https://www.cnblogs.com/beeenwei/p/12962049.html