mysql基础知识点五-MVCC
Mysql在可重复读隔离级别下如何保证事务较高的隔离性,我们上节课给大家演示过,同样的sql查询语句在一个事务 里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认 是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操 作加锁互斥来实现的。 Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制
下面看一下undo日志版本链与read view机制详解 (这个最重要)
首先undo日志版本链是一行数据被多次修改后会保留回滚的undolog,并且用俩个隐藏字段trx_id,roll_pointer把这些undolog串联成一个版本链。
read view别名,一致性视图,在事务结束之前不会变化,(读提交隔离级别下一致性视图每次提交都会重新生成),这个视图对应id要和数组中最小id和最大id进行比较,从而得到最终快照
版本链比对规则
注意看图片右下角,那是个比对规则 1. trx_id<min_id,表示为已提交 2. trx_id>max_id, 表示不可见, 3. min_id<=trx_id<=max_id时,trx_id在视图组中则表示由未提交事务产生不可见,反之可见。 对于删除可以认为是特殊的update,查看该条记录的头信息(record header)里的(deleted_flag)为true,代表删除
关于begin/start transaction的注意事项
当他们遇到第一个修改语句时,事务才真正启动,向mysql申请事务id。
Innodb引擎SQL执行的BufferPool缓存机制
看上面这个错综复杂的流程,为啥不直接更新磁盘上数据呢?
首先性能差,一个请求过来就对磁盘文件随机读写,然后在更新数据
其次磁盘读写能力很差,然后直接更新磁盘文件导致数据库并发能力会很差
mysql这套复杂的机制可以保证更新的是内存bufferPool,然后在顺序写日志,同时海能保证数据一致性。
这套机制能保证mysql抗住每秒几千的读写