• MySql 事务隔离实现:


    MySql 事务隔离实现:不同时刻启动的事务会有不同的read-view。同一条记录在系统中可以存在多个版本, 就是数据库的多版本并发控制(MVCC) 。

    在MySQL里, 有两个“视图”的概念
    1. view:它是一个用查询语句定义的虚拟表, 在调用的时候执行查询语句并生成结果。
    创建视图的语法是create view …, 而它的查询方法与表一样。
    2. InnoDB在实现MVCC时用到的一致性读视图, 即consistent read view: 用于支持
    RC(Read Committed, 读提交) 和RR( Repeatable Read, 可重复读) 隔离级别的实现。

    “快照”在MVCC里是怎么工作:

    每个事务有一个唯一的事务ID, 叫作transaction id。 它是在事务开始的时候向
    InnoDB的事务系统申请的, 是按申请顺序严格递增的。每行数据也都是有多个版本的。 每次事务更新数据的时候, 都会生成一个新的数据版本, 并且把transaction id赋值给这个数据版本的事务ID, 记为row trx_id。 同时, 旧的数据版本要保留,并且在新的数据版本中, 能够有信息可以直接拿到它。也就是说, 数据表中的一行记录, 其实可能有多个版本(row), 每个版本有自己的row trx_id。InnoDB利用了“所有数据都有多个版本”的这个特性, 实现了“秒级创建快照”的能力。
     

    数据库版本可见性:

    1. 绿色, 版本已提交,可见
    2. 红色, 版本未提交,不可见
    3. 黄色, 两种情况:
    3.1. 版本在视图创建后提交, 不可见
    3.2. 版本在视图创建前提交, 可见

    小结:

    InnoDB的行数据有多个版本, 每个数据版本有自己的row trx_id, 每个事务或者语句有自己的一
    致性视图。 普通查询语句是一致性读, 一致性读会根据row trx_id和一致性视图确定数据版本的
    可见性。
    对于可重复读, 查询只承认在事务启动前就已经提交完成的数据;
    对于读提交, 查询只承认在语句启动前就已经提交完成的数据;
    而当前读, 总是读取已经提交完成的最新版本。
     


    在实现上,数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准。在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。在“读提交”隔离级别下,这个视图是在每个 SQL 语句开始执行的时候创建的。这里需要注意的是,“读未提交”隔离级别下直接返回记录上的最新值,没有视图概念;而“串行化”隔离级别下直接用加锁的方式来避免并行访问。

  • 相关阅读:
    隧道工程资质怎么办理,办理隧道工程三级资质有什么要求
    Cesium学习六:使用entity绘制ellipsoid
    P1038 [NOIP2003 提高组] 神经网络 ( 拓扑
    《入门级-Cocos2dx4.0 塔防游戏开发》---第十一课:游戏地图信息初始化
    基于约束关系的图表设计
    论文学习——水文时间序列相似性查询的分析与研究
    集合知识点总结
    C语言编程陷阱(三)
    vue 监听dom元素尺寸大小改变
    pdf文件属性的删除
  • 原文地址:https://blog.csdn.net/xd592319702/article/details/126749159