事务机制与锁
事务ACID特性(4大特性):原子性;一致性;隔离性;持久性。
事务隔离性(四大隔离级别):读未提交;读已提交;可重复读;串行。
脏读:读到了别的事务还没有提交,可能随时会被回滚掉的,有可能不存在的数据,这叫做脏读。
可重复读:我第一次查到的数据,我之后在我这个事务里面再次重复查的话,它永远是你第一次查出来的结果,这叫做可重复读。
后面查的所有的数据,都是你执行第一条sql查询语句当时那一刻的数据,任何其他记录的查询都是这样子,不光第一次执行的sql查询的一条记录,其他也是可重复读的,它读的是我们当时查第一条sql语句它当时的那个值。
间隙锁结合可重复读,可以解决幻读问题。
串行化:默认情况下,其他三种情况,读不加锁;但串行化,读和写都会进行加锁。所以没有并发问题,但效率低。
串行化底层实现机制:每一条sql语句都会加锁,操作相同数据,都要拿到同一把锁。
串行化案例:
事务1,执行查询操作,先不提交。
事务2,执行update操作,一直在等待,未结束。当事务1,提交后,事务2,才顺序继续执行,运行结束。
事务1与事务2反过来,同样如此:
读未提交+读锁=串行化:
默认隔离级别:
MVCC机制:
NACOS核心架构图:(核心:读写分离)
脏数据(半数据)≠ 旧数据
RR级别(小公司,并发量低,采用数据用于制作报表):可重复读;查我们的历史的版本链;是找之前版本,我第一次查询的 那条 已提交的数据。
RC级别(互联网的大公司,并发高,采用该级别):读已提交;每次都是在版本链里边,找最新的这条数据,已经提交的数据。
MVCC原理详解:
阿里一面面试题:查询操作需要加事务吗?
数据库SQL涉及必知必会锁相关:
SQL优化及阿里索引规则相关:
Explain:
长事务的影响及长事务的优化:
MySQL执行过程与BufferPool缓存机制(不需要详细了解):
超高并发mysql事务优化|bufferpool内存结构及innodb页结构详解
通过free链表很方便的对空白页进行管理。对于链表来说,删除的性能本来就很快。当bufferPool中某一页空出来了,则把对应的页添加到free链表里边去。被占用则会被从链表里删除。
通过flush链表很方便的对脏页进行管理。每一页对应一个控制块。对于update更新等写操作,先从bufferPool找到对应的页,进行更新操作。标记为脏页,更新该页地址节点到flush链表中去,后台有新的线程定时的负责持久化到磁盘。
lru链表
满的时候,先淘汰冷数据区域的。
当超过1s存在再次访问控制块,则将其从冷数据区域转移到热数据区域。
free链表和flush链表详述
LRU链表及升级优化版本的LRU链表详述
redo-log
参考视频资料学习整理:
2022年小破站讲的最好的MySQL事务优化&阿里内部锁机制最佳实践
https://www.bilibili.com/video/BV1e14y1x7Sg?p=1
同完全重复https://www.bilibili.com/video/BV1434y1J7LK?p=1
同一样完全重复https://www.bilibili.com/video/BV1qD4y167VF
以及一样重复https://www.bilibili.com/video/BV1bg411U71t?p=1
同
我翻遍了整个B站,这是我见过最好的MySQL事务原理与锁机制教程
https://www.bilibili.com/video/BV1rT41177hG?p=1