zoukankan      html  css  js  c++  java
  • MySQL的MVCC

    1、MVCC

    MVCC(Multi-Version Concurrency Control),多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。在编程语言中实现事务内存。

    1、为什么需要MVCC?

    • 数据库通常使用锁来实现隔离性。最原生的锁,锁住一个资源后会禁止其他任何线程访问同一个资源。
    • 但是很多应用的特点都是读多写少。很多数据的读取次数远大于修改的次数。而读取数据间互相排斥显得不是很重要。所以就使用了一种读写锁的方法。
    • 读锁和读锁之间不互斥,但是写锁和写锁,写锁和读锁之间是互斥的。这样很大提升了系统的并发能力。
    • 后来随者业务扩展,发现并发读取还是不够。又提出了能不能让读写之间也不冲突的方法。就是读取数据时,通过一种类似快照的方式将数据保存下来。这样读锁和写锁不冲突了,不同的事务session会看到自己特定版本的数据。当然快照只是一种概念模型,不同的数据库可能用不同的方式来实现这种功能。

    2、InnoDB与MVCC

    • MVCC只在Read Committed读已提交,Repeatable Read可重复读这2个隔离级别下工作。其他2个读未提交,可串行化,两个隔离级别和MVCC不兼容。
    • 因为Read Uncommitted读未提交总是读取最新的数据行,而不是符合当前事务版本的数据行。
    • Serializable可序列化,则会对所有读取的行都加锁,效率最慢。

    3、Redo Log,Bin Log,Undo Log

    1、BinLog

    • Bin Log就是MySQL服务层产生的日志,常用来进行数据恢复、数据库复制 ,常见的MySQL的主从架构,就是采用Slave同步Master的Bin Log实现的。另外通过解析Bin Log能够实现MySQL到其他数据源比如ES的数据复制。

    2、Redo Log

    • Redo Log记录了数据操作在物理层面的修改。MySQL中使用了大量缓存,缓存存在内存中,修改操作时会直接修改内存,而不是离开修改磁盘。当内存和磁盘的数据不一致的时候,叫做内存中的数据为脏页Dirty Page。为了保证数据的安全性,事务进行中时会不断的产生Redo Log,在事务提交的收进行一次Flush刷盘操作,保存数据到磁盘中。Redo Log时按照顺序写入的,磁盘的顺序读写的速度远大于随机读写。当数据库挂掉重启的时候,会根据Redo Log进行数据的恢复,如果Redo Log中有事务提交,则进行事务提交修改数据。这样实现了事务的原子性、一致性和持久性。

    3、Undo Log

    • InnoDB中通过Undo Log实现了数据的多版本,而并发控制通过锁来实现。
    • Undo Log除了实现MVCC外,还用于事务的回滚。MySQL的InnoDB中存在多种日志,除了错误日志、查询日志外,还有很多和数据持久性,一致性有关的日志。
    • 除了记录Redo Log外,当进行数据修改的时候还会记录Undo Log,Undo Log用来数据的撤回操作,它记录了修改的反向操作,比如,插入对应删除、修改对应修改为原来的数据。
    • 通过Undo Log实现事务回滚,并且可以根据Undo Log回溯到某个特定的版本的数据,实现MVCC多版本并发控制

     

  • 相关阅读:
    leetcode腾讯精选练习之最长公共前缀(九)
    leetcode腾讯精选练习之螺旋矩阵(八)
    leetcode腾讯精选练习之删除链表中的结点(七)
    leetcode腾讯精选练习之相交链表(六)
    leetcode腾讯精选练习之旋转链表(四)
    leetcode腾讯精选练习之链表逆置(三)
    leetcode腾讯精选练习之合并有序链表(二)
    leetcode腾讯精选练习之两数相加(一)
    const理解
    树莓派-淘宝-百度网盘资料-免费下载
  • 原文地址:https://www.cnblogs.com/drq1/p/14545182.html
Copyright © 2011-2022 走看看