什么MVCC
用来解决两个事务 读-写或者写-写的问题
就是用来解决读写冲突的问题
虽然可以用锁解决但是信息有些差
mvcc就是通过多个数据行的版本管理来实现数据库的并发控制
快照读
又叫 一致性读,读的是快照数据,不加锁简单的select都是快照读
快照读不一定是最新的
当前读
当前读就是读取记录的最新版本,读取的时候还要保证其他事务不能修改
什么是readView
readView负责管理事务过来读那一版本的数据(或者说哪一个版本的undo log)
readView就是事务在使用mvcc进行快照读时产生的读视图。当事务启动,数据库内部会有一个快照,innodb为每个事务都构建了一个数组,用来维护当前活跃事务的id(启动还没有提交的事务)
readVIew的设计结构
readView是解决隔离级别里面的可重复读和提交读两种级别
readView结构:
- creator_trx_id 创建这个read view的事务id(只有对表写操作才会分配这个id)
- trx_ids 表示在生成read view时当前系统中活跃的读写事务的id列表
- up_limit_id 活跃事务最小的事务id
- low_limit_id 系统中最大的事务id
read view判断的规则
- 如果被访问版本的trx_id熟悉和read view中creator_trx_id相同可以访问(这表明是自己在操作自己)
- 如果被访问版本的trx_id熟悉值小于read view中up_limit_id,表面该版本已经提交可以访问
- 如果被访问版本的trx_id属性值大于或者等于read view中的low_limit_id值,表明事务在当前事务生成后才有的所以不能访问
- 如果被访问版本的trx_id是爱read view的up_limit_id和low_limit_id之间,那就需要判断一下是否在trx_ids中。如果在说明read view生成的时候还是活跃的不可以访问。如果不在表面已经提交可以访问
如果隔离级别是读已提交,每一次select都会生成一次read view
可重复读隔离级别 只在第一次select中产生
幻读在事务提交后事务id大于读事务的low_limit_id,所以无法读
文章有(1)条网友点评
内容太少了,无关联内容。