select a.id,a.name from A a where a.id=1
返回(1,dingw),此结结果不受事务B的影响,尽管B事务已经提交。
如何实现上述需求呢?如果通过锁是可以实现的,如果A事务对A表进行查询操作,使得B事务的更新无法执行,这样在A事务结束后B事务才能执行,能实现可重读隔离级别,但并发读明显不理想,有没有一种无锁设计来实现可重复读隔离级别呢?InnoDB使用MVCC(多版本并发控制协议来实现可重复读隔离级别)
MVCC 为每行数据增加二列(更新版本号,删除版本号)[版本号存储的其实就是事务ID]【可重读隔离级别】
select 操作:
Mysql只返回满足如下条件的行数据:
1)更新版本号小于或等于当前事务ID(小于表示是事务开始之前的数据,等于表示当前事务对数据进行过修改。)
2)删除版本号要么为空,要么大于当前事务ID,(如果为空,表示未删除,如果大于事务ID,表示是以后修改的)
insert 操作
1)更新版本号设置为当前事务ID,删除版本号为空
update 操作
update操作为分差为两条语句,先复制一份数据,将删除版本号设置为当前事务ID(这样保证select时不会查出该数据),然后插入一条新纪录(insert),其更新版本号为当前事务ID,删除版本号为空
delete 操作
将删除版本号设置为当前事务ID
mysql会定时清理这些多余数据。
InnoDB存储引擎的MVCC版本基于Undo日志,详情请关注后续文章。
欢迎加笔者微信号(dingwpmz),加群探讨,笔者优质专栏目录:
3、源码分析Dubbo专栏(28篇+)
4、源码分析Mybatis专栏
总结:心得体会
既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。
学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。
面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。
最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
学习路线,避免低效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
[外链图片转存中…(img-bD8DsQRQ-1714425971534)]