目录
MySQL 脑图
MVCC是什么?有什么用?
MVCC 字面的含义是多版本控制机制,它是一种方法论,主要思想就是通过对数据源的数据实现多个版本的控制,并发情况下,读写操作可以按序读取不同版本的数据提高mysql的并发性而不用加锁的一种方法!
什么是快照读和当前读?
当前读是一种加锁的实现方式,读取数据库中最新的数据并且这个过程会加锁不允许有其他的数据修改此数据!
快照读指的是可能读取到的不是最新的一份数据,而是在查询时刻对现有的数据库做一个快照,然后读取快照的中数据;后续的数据修改对于这份快照而言是不可见的!
隐藏字段是什么?分别有什么用?
transaction_id : 事务id其实也可以理解成版本号,每次写操作都会对数据修改一个递增的id号;
row_id:行号id,就是聚簇索引
rollback_point:回滚内容指针,指向当前数据的历史版本在undolog中的内存地址;
对数据库每次的写操作数据库都会给这个操作分配一个递增的事务id,用于表示操作的前后的顺序;
rollback point是指向当前数据的版本链的上一个数据的内存位置;
介绍一下undoLog?
undo log 分成两种
- insert undo log:插入语句生成的undo log 在发生回滚时,就删除这个log
- update undo log:修改的语句生成的undo log ,rollback point 保存的是此数据上一个历史数据的内存地址
介绍一下ReadView?
ReadView 是查询语句在查询的数据的时候会创建一个数据快照视图,包含当时的数据以及快照生成时的活跃事务情况;
readview中包含了查询时的数据库快照,以及版本链中那些版本是可见的那些是不可见的;
readView中的字段
transaction_list:活跃的事务列表
min_transaction_id:最小的活跃事务id
max_transaction_id:等于当前活跃的事务id+1;用意是值还没开始的事务id
read_commited隔离级别
因为这个隔离级别是一个select会创建一个read view 所以一个事务中如果有多个select的话,非首次的read view 就会有更高版本的数据,所以就会有数据不一致的情况;
repeatable read 隔离级别
就是一个事务就开一个read view,但是insert的数据是没有旧数据的,所以会被查询进来,是采用间隙锁处理的这个问题 防止了幻读
间隙锁:是根据当前事务首次查询的数据按索引按某种规则分区,比如查询的范围是在id在[4,40]之间的,那么这个范围就会被锁定无法写数据进来从而实现避免幻读的情况