MVCC多版本并发控制机制
MySQL在可重复读的隔离级别下查询语句在一个事务下多次执行的查询结果相同,就算其他事务对数据做了修改也不会改变当前事务的查询结果,这个隔离性就是由MVCC(Mutil-Version Concurrency Control)实现的,对一行记录的读和写是不会通过加锁互斥来保证隔离性的,避免了频繁加锁互斥。而在可串行化隔离级别为了保证隔离性,所有的操作都是通过加锁互斥来实现的。
MySQL在读已提交和可重复读隔离级别下都实现了MVCC机制。
undo日志版本链与read view机制
undo日志版本链是指一行记录被多个事务依次修改后,在每个事务修改完成后,MySQL都会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链。
在可重复读隔离级别,当事务开启时,执行任何查询的语句时会生成当前事务的一致性试图read-view,该视图在事务结束前不会发生变化(如果时读已提交级别在每次执行查询时会重新生成),这个试图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,比如当前未提交的最小事务id为10,最大未提交事务id为50,已创建的最大事务id为80且80的事务已提交,此read-view视图为[10,50],80。事务里的任何查询结果需要从对应版本链里