• MySQL Innodb MVCC(多版本并发控制)


    原理:

    MVCC可以提供基于某个时间点的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据,而不管这个事务执行的时间有多长。所以在不同的事务看来,同一时刻看到的相同行的数据可能是不一样的,即一个行可能有多个版本。

    MVCC具体实现
    InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,其中一列存储行被创建的“时间”,另外一列存储行被删除的“时间”。这里的“时间”并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每当一个事务开始的时候,innodb都会给这个事务分配一个递增的版本号,所以版本号也可以被认为是事务号。 

    在repeated read的隔离级别下,具体各种数据库操作的实现: 
    1.select:满足以下两个条件innodb会返回该行数据: 
    (1)该行的创建版本号小于等于当前版本号,用于保证在select操作之前所有的操作已经执行落地。 
    (2)该行的删除版本号大于当前版本或者为空。删除版本号大于当前版本意味着有一个并发事务将该行删除了。 

    2.insert:将新插入的行的创建版本号设置为当前系统的版本号。 

    3.delete:将要删除的行的删除版本号设置为当前系统的版本号。 

    4.update:不执行原地update,而是转换成insert + delete。将旧行的删除版本号设置为当前版本号,并将新行insert同时设置创建版本号为当前版本号。 

    以上4条,写操作(insert、delete和update)执行时,需要将系统版本号递增。

    优点:降低其系统开销。在读取数据的时候,innodb几乎不用获得任何锁,每个查询都通过版本检查,只获得自己需要的数据版本,从而大大提高了系统的并发度。


    缺点:为了实现多版本,innodb必须对每行增加相应的字段来存储版本信息,同时需要维护每一行的版本信息,而且在检索行的时候,需要进行版本的比较,因而降低了查询的效率;innodb还必须定期清理不再需要的行版本,及时回收空间,这也增加了一些开销。

    https://blog.csdn.net/u012512634/article/details/72453511

  • 相关阅读:
    npm ERR! code EINTEGRITY npm! ERR! shal-
    Python 的类的下划线命名有什么不同?
    Linux下通过源码编译安装程序
    Mac OSX下Sublime Text配置使用Ctags实现代码跳转
    Python基础-*args和**kwargs魔法变量
    alpha版、beta版、rc版的意思
    英特尔第四代酷睿处理器数字和字母代表什么意思
    笔记本CPU低压和标压有什么区别?
    MySQL通过localhost无法连接数据库的解决
    sudo:无法解析主机 解决方案
  • 原文地址:https://www.cnblogs.com/cnsec/p/13547568.html
Copyright © 2020-2023  润新知