zoukankan      html  css  js  c++  java
  • MVCC版本链

    对于使用InnoDB存储引擎的表来说,它的聚簇索引记录中都包含两个必要的隐藏列:

    • trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。
    • roll_pointer:每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

    每次对记录进行改动,都会记录一条undo日志,每条undo日志也都有一个roll_pointer属性(INSERT操作对应的undo日志没有该属性,因为该记录并没有更早的版本),可以将这些undo日志都连起来,串成一个链表,所以现在的情况就像下图一样:

    image_1d8po6kgkejilj2g4t3t81evm20.png-81.7kB

    对该记录每次更新后,都会将旧值放到一条undo日志中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被roll_pointer属性连接成一个链表,我们把这个链表称之为版本链,版本链的头节点就是当前记录最新的值。另外,每个版本中还包含生成该版本时对应的事务id,这个信息很重要,在根据ReadView判断版本可见性的时候会用到。

    ReadView和版本的生成时间?

    • ReadView在事物开始或者每条Select语句开始生成,与事务隔离级别有关。
    • 版本是在对记录进行改动的时候生成。

    所以在事务并发的场景下,如果本事务存在对数据的改动,要注意记录trx_id的变化对接下来数据可见性的影响。

  • 相关阅读:
    ASP.NET的单值绑定
    ASP+SQL 文件、目录,文本文件等多种操作类
    Access转换为 MS SQL 有什么要注意的地方
    ASP的一些珍藏代码
    SQL SERVER的数据类型
    .Net 文件名后缀的详细解释
    JSF(JavaServer Faces)学习手册-入门篇(1.1)
    xManager登录HP_UX出现乱码
    Tomcat常用调优技巧
    JSF(JavaServer Faces)学习手册-入门篇-参考文献
  • 原文地址:https://www.cnblogs.com/jmliao/p/13207208.html
Copyright © 2011-2022 走看看