• MySQL 学习(六) InnoDB事务及MVCC


    MySQL学习目录
     
    事务
    事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失效。
    事务的特性:
    1.原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
    2.一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
    3.隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
    4.持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
    InnoDB的ACID的实现原理如图:
    0
    redo log(保持数据的一致性和持久性)
    重做日志,记录的是事务提交时数据页的物理修改,时用来实现事务的持久性。
    该日志文件由两部分组成,重做日志缓冲区(redo log buffer)以及重做日志文件(redo log file),前者在内存中,后者在磁盘中。当事务提交之后,会把所有修改信息都存到该日志文件中,用于在刷新脏页到磁盘时,进行数据恢复使用。
    0
    大概的工作流程时,当提交事务后,InnoDB首先查看Buffer Pool中是否有需要操作的数据,如果没有,从磁盘中读取到Buffer Pool中,然后根据事务修改Buffer Pool中的数据,然后将数据变化存储到redo log bugger中,redo log buffer 将更改追加到磁盘中的redo log file中,Buffer Pool中的脏页数据正常更新到磁盘时,不会用到redo log file,当更新异常时,才会用到。redo log file中的记录会定期更新,或者说是会被覆盖掉。
    undo log(保持数据的原子性)
    回滚日志,用于记录数据被修改前的信息,作用包含两个,提供回滚和MVCC(多版本并发控制)。
    undo log 和redo log 记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log 中会记录一条对应的insert记录,反之亦然,当update一条记录时,它对应一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到乡音改动内容并进行回滚。
    undo log 销毁:undo log 在事务执行时产生,事务提交时,并不会立即删除 undo log,因为这些日志可能还用于MVCC。
    undo log 存储:undo log 采用段的方式进行管理和记录,存放在前面介绍的rollback segment回滚段中,内容包含1024个undo log segment。
     
    MVCC
    基础概念
    1.当前读
    读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:
    select ...lock in share mode(共享锁),select ... for update,insert,delete(排他锁)都是一种当前读。
    2.快照读
    简单的select(不加锁)就是快照读,快照都读取的时记录数据的可见版本,有可能时历史数据,不加锁,是非阻塞读。
    Read Committed:每次Select,都生成一个快照读。
    Repeatable Read:开启事务后第一个select 语句才是快照读的地方。 就是事务中第一个select语句会生成一个快照,此后对该select语句中设计到的表的读取,都应该是基于快照,也就是快照之后产生的对表的更新,在此事务中的再次读取时,不会被查询到。
    Serializable:快照读会退化为当前读。
    3.MVCC
    全程Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,是的读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现,还需要依赖于数据库记录中的三个隐藏字段,undo log日志,readView。
     
    MVCC 隐藏字段
    记录中的隐藏字段
    0
    其中DB_ROW_ID不是每个表都会创建的,只有没有设置主键的时候,才会自动创建。
     
    undo log 版本链
    undo log
    回滚日志,在Insert,update,delete的时候产生的便于数据回滚的日志。
    当insert的时候,产生发undo log 日志只在回滚的时候需要,在事务提交后,可被立即删除。
    而update,delete的时候,产生的undo log 日志不仅在回滚的时候需要,在快照读的时候也需要,不会立即删除。
    0
    不同事务或相同事务对同一条记录进行修改,会导致该记录undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。
     
    readview
    ReadView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。
    ReadView中包含了四个核心字段:
    0
    0
    不同的隔离级别,生成ReadView的时机不同:
    1.READ COMMITTED(读已提交):在事务中每一次执行快照读时生成ReadView。
    0
    0
    2.REPEATABLE READ(可重复读):仅在事务中的第一次执行快照读时生成ReadView,后续复用该ReadView。
    0
    0
     
  • 相关阅读:
    iOS开发UI篇—懒加载
    iOS开发UI篇—简单的浏览器查看程序
    iOS开发UI篇—transframe属性(形变)
    iOS开发UI基础—手写控件,frame,center和bounds属性
    iOS开发UI篇—Button基础
    Foundation框架—集合
    Foundation框架—字符串
    Foundation框架—结构体
    ios 工程配置统一增加类的前缀(知识点也只能算知识点)
    Runtime 函数 Swizzling 改变OC方法的调度顺序
  • 原文地址:https://www.cnblogs.com/pangzili/p/16439396.html
Copyright © 2020-2023  润新知