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多版本并发控制

     

  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/drq1/p/14545182.html
Copyright © 2011-2022 走看看