MySQL技术内幕-InnoDB存储引擎读书笔记(mysql存储引擎概述)

1、Mysql 存储引擎概述
Mysql表存储引擎众多,我们重点了解一下MyISAM与InnoDB
MyISAM存储引擎不支持事务,仅支持表级锁,支持全文索引,适合读多写很少的应用场景,在实际开发中很少使用。
InnoDB存储引擎支持事务,支持行锁,支持SQL4种隔离级别(读未提交、读已提交、可重读、串行化),支持多版本并发控制(MVCC)实现无锁的并发读。
事务的隔离级别针对的是读操作。
MVCC多版本并发控制,主要是InnoDB为支持无锁的并发控制,实现读已提交、可重读隔离级别,所谓的可重复读就是在一个事务中读取同一条记录,返回的数据一致。举例如下:
  A 事务                                                                                                      B事务  
 start transalation                                                                                      start transalation                                        
select a.id,a.name from A a where a.id=1
 返回( 1,dingw)                                                                                          update A set  a.name='dingw2'  where a.id=1
                                                                                                                  commit
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),加群探讨,笔者优质专栏目录:

1、源码分析RocketMQ专栏(40篇+)
2、源码分析Sentinel专栏(12篇+)
3、源码分析Dubbo专栏(28篇+)
4、源码分析Mybatis专栏
5、源码分析Netty专栏(18篇+)
6、源码分析JUC专栏
7、源码分析Elasticjob专栏
8、Elasticsearch专栏
9、源码分析Mycat专栏

 

你可能感兴趣的:(MySQL)