zoukankan      html  css  js  c++  java
  • MVCC原理 4步 什么是MVCC、事务ACID、事物隔离级别、Innodb存储引擎是如何实现MVCC的

    MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写。
    事物
    A 原子性
    C 一致性
    I 隔离性
    D 持久性
    高并发的场景下的问题
    脏读
    不可重复读
    幻读
    事物隔离级别
    RU读未提交 脏读/不可重复读/幻读 。不适用MVCC读,可以读到其他事务修改甚至未提交的。
    RC读已提交 不可重复读/幻读 。其他事务对数据库的修改,只要已经提交,其修改的结果就是可见的,与这两个事务开始的先后顺序无关,不完全适用于MVCC读。
    RR可重复读 幻读 。完全适用MVCC,只能读取在它开始之前已经提交的事务对数据库的修改,
    在它开始以后,所有其他事务对数据库的修改对它来说均不可见。
    S串行化 / 。完全不适合适用MVCC,这样所有的query都会加锁,再它之后的事务都要等待。
    Oracle Postgresql 默认RC
    MySQL Innodb 默认RR
    InnoDB实现MVCC的方法:多版本并发控制
    InnoDB实现MVCC的方法是,它存储了每一行的三个额外的隐藏字段。
    1.DB_TRX_ID 6byte的标识 每处理一个事务,其值自动+1
    创建时间”和“删除时间”记录的就是这个DB_TRX_ID的值
    如insert、update、delete操作时用1个bit表示
    2.DB_ROLL_PTR: 大小是7byte,指向写到rollback segment(回滚段)的一条undo log记录
    (update操作的话,记录update前的ROW值)
    3.DB_ROW_ID: 大小是6byte,该值随新行插入单调增加,当由innodb自动产生聚集索引时聚集索引(即没有主键时,因为MYSQL默认聚簇表,会自动生成一个ROWID)
    DB_TRX_ID记录了行的创建的时间删除的时间在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。
    a.新增,在insert操作时 “创建时间”=DB_TRX_ID,这时,“删除时间”是未定义的;
    b.修改,在update时,复制新增行的“创建时间”=DB_TRX_ID,删除时间未定义,旧数据行“创建时间”不变,删除时间=该事务DB_TRX_ID;
    c.删除,delete操作,相应数据行的“创建时间”不变,删除时间=该事务的DB_ROW_ID;
    d.查询,select操作对两者都不修改,只读相应的数据;
    SELECT
    Innodb检查每行数据,确保他们符合两个标准:
    1.InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行。
    2.行的删除操作的版本一定是未定义的或者大于当前事务的版本号。确定了当前事务开始之前,行没有被删除 符合了以上两点则返回查询结果。
    INSERT
    InnoDB为每个新增行记录当前系统版本号作为创建ID。
    DELETE
    InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。
    UPDATE
    InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/dbalightyear/p/11286418.html
Copyright © 2011-2022 走看看