弹窗网站制作器,云端服务器,c2c网站建站的标准,wordpress类目MVCC
MVCC#xff0c;是Multiversion Concurrency Control的缩写#xff0c;翻译过来是多版本并发控制#xff0c;和数据库锁样#xff0c;他也是一种并发控制的解决方案
我们知道#xff0c;在数据库中#xff0c;对数据的操作主要有2种#xff0c;分别是读和写…MVCC
MVCC是Multiversion Concurrency Control的缩写翻译过来是多版本并发控制和数据库锁样他也是一种并发控制的解决方案
我们知道在数据库中对数据的操作主要有2种分别是读和写而在并发场景下就可能出现以下 旦三种情况读-读并发读-写并发写-写并发 我们都知道在没有写的情况下读-读并发是不会出现问题的而写-写并发这种情况比较常用的就是通过加锁的方式实现。那么读-写并发则可以通过MVCC的机制解决。
快照读和当前读
快照读就是读取的快照数据即快照生成的那一刻的数据像我们常用的普通的SELECT语句在不加锁的情况下就是快照读
如select * from table_name where xxx;
当前读当前读就是读取最新数据加锁的select或者对数据进行增删改都会进行当前读
如SELECT *FROM xx_table LOCK IN SHARE MODE
SELECT *FROM xx_table FOR UPDATE;
INSERT INTO xx_table ...DELETE FROM xx_table ...UPDATE xx_table ...
在mysql中只有已提交读和重复读两种事物隔离级别才会使用快照读
Undolog
undo log是Mysql中比较重要的事务日志之一顾名思义undo log是一种用于回退的日志在事务没提交之前MySQL会先记录更新前的数据到 undo log日志文件里面当事务回滚时或者数据库崩溃时可以利用 undo log来进行回退。 这里面提到的存在undo log中的更新前的数据”就是我们前面提到的快照。所以这也是为什么很多人说UndoLog是MVCC实现的重要手段的原因。 那么一条记录在同一时刻可能有多个事务在执行那么undo log会有一条记录的多个快照那么在这一时刻发生SELECT要进行快照读的时候要读哪个快照呢? 这就需要用到另外几个信息了
行记录的隐式字段
数据库中除了自己定义的字段外还有一些重要的隐式字段
db_row_id隐藏的行 ID用来生成默认聚集索引。如果我们创建数据表的时候没有指定聚集索引这时 InnoDB 就会用这个隐藏 ID 来创建聚集索引。采用聚集索引的方式可以提升数据的查找效率。db_trx_id操作这个数据的事务 ID也就是最后一个对该数据进行插入或更新的事务 ID。db_roll_ptr回滚指针也就是指向这个记录的 Undo Log 信息
因为每一次修改之前都会先存储一份快照到undo log中那么这几个隐式字段一会一起保存到undo log中就这样每一个快照中都有一个db_trx_id 事物id字段表示了对这条记录最新一次修改的事物ID以及一个回滚指针指向上一个快照地址 Read View
有了undo log又有了几个隐式字段我们好像还是不知道具体应该读取哪个快照那怎么办呐
这就需要用到read View
read view 主要来帮我们解决可见性问题的即他会来告诉我们应该看到哪个快照不应该看到哪些快照
在 Read View 中有几个重要的属性:
trx ids系统当前未提交的事务 ID 的列表low limit id应该分配给下一个事务的id 值up limit id未提交的事务中最小的事务 IDcreator trx id创建这个 Read View 的事务ID
其实原值比较简单那就是事物ID大的事务应该能看到事务ID小的事物的变更结果反之则不能
所以总结一下
在InnoDB中MVCC就是通过Read View Undo Log来实现的undo log中保存了历史快照r而Read View用来判断具体哪一个快照是可见的。