首页 > 其他分享 >MVCC机制

MVCC机制

时间:2023-09-24 13:44:08浏览次数:49  
标签:事务 read trx MVCC 机制 id view

MVCC机制在读已提交级别下生效的。为了避免加锁导致的读写冲突导致性能下降的另外一套事务隔离机制。

MVCC需要提及以下概念

  • 行的隐藏字段

    • trx_id:保存着对该条记录进行修改操作的事务id
    • roll_ptr:指向历史版本的指针。(历史版本是指许多事务修改前的数据,类似链表的结构)
  • read view的四个字段

    • create_trx_id:创建read_view的事务id
    • m_ids:保存着活跃但是未提交的事务id列表
    • min_id:保存着m_id的最小值
    • max_id:保存数据库事务的下一个id

注意:readview是保存在事务里边的,不是保存在行记录的

如何判断事务数据是否可见

当事务访问某一行的时候,判断当前行是否是自己创建的。trx_id存在于行里,是指修改该记录的事务

  • 是,没有任何问题,可以修改读取

  • 否,检查trx_id和自己的read_view的min_id比较

    • 小于等于:说明修改记录的事务在当前事务开始前已经提交了(m_id保存着活跃但未提交的事务id),可以读取
    • 大于:是在当前事务开始前就存在的事务。
  • 如果trx_id>=max_id,说明说明修改记录的事务在当前事务开始后创建的事务,不可见。

  • 如果trx_id在m_id,说明修改记录的事务还在活跃,不能读取。

  • 如果trx_id不再在m_id,说明修改记录的事务没有活跃已经提交,可以读取。

总结:

  • trx_id<=min_id可见
  • trx_id>=max_id不可见
  • trx_id在m_ids不可见
  • trx_id不在m_ids可见

如果不可见,会顺着roll_ptr一直寻找下一条记录,重复比较,直到某条记录可见。

s

MVCC在读已提交和可重复读区别

区别在于生成read_view的时机。

读已提交:每次读取每一行数据之前都会生成新的read_view

可重复读:事务创建时生成read_view,之后一直使用read_view,不会继续创建

标签:事务,read,trx,MVCC,机制,id,view
From: https://www.cnblogs.com/xiuer211/p/17725906.html

相关文章

  • 说说 Java 类加载机制是什么
    加载,获取类的字节码,并且放到jvm的元空间中,生成Class对象链接验证:验证字节码是否符合jvm的规范,是否安全等准备:将静态变量赋默认值(不是自己的默认值,而是int是0这种)解析:将符号引用转为直接引用初始化:将静态变量赋初始值(自己写的初始值),执行静态代码块使用卸载:将Class对象清......
  • 事务和锁机制
    事务和锁机制事务和MySQL一样,在Redis中也有事务机制,当我们需要保证多条命令一次性完整执行而中途不受到其他命令干扰时,就可以使用事务机制。我们可以使用命令来直接开启事务:multi当我们输入完所有要执行的命令时,可以使用命令来立即执行事务:exec我们也可以中途取消事务:di......
  • ClickHouse的数据持久化与恢复机制
    简介ClickHouse是一个高性能的列式数据库,它的数据持久化和恢复机制是其重要的特性之一。本文将深入探讨ClickHouse的数据持久化与恢复机制。数据持久化ClickHouse的数据持久化是通过将数据写入磁盘来实现的。ClickHouse使用了一种称为MergeTree的存储引擎,它将数据按照时间戳分成......
  • Windows 消息机制
    目录Windows和消息消息和消息队列Windows消息类型Windows系统的整个消息系统分为3个层级Q&AWinForm程序中消息处理的相关方法其他代码片段相关参考Windows和消息消息和消息队列名称说明消息和消息队列本部分介绍消息和消息队列,以及如何在应用程序中使用它们。......
  • redisde持久化机制
    他的持久化机制有两种一种是(rdb)快照一种是(aof)日志快照的话是全量的一个备份日志是连续的增加备份.快照机制是redis默认开启de,她会根据配置的策略将内存的数据保存在本地的二进制文件中官方提供两种方式生成快照一种是save命令但是有缺点会阻塞我们的主进程当如果数......
  • 从Android事件分发机制看滑动冲突解决方案
    事件分发机制从ViewGroup的dispatchTouchEvent入手publicbooleandispatchTouchEvent(MotionEventev){...finalbooleanintercepted;if(actionMasked==MotionEvent.ACTION_DOWN||mFirstTouchTarget!=null){fi......
  • Redis持久化机制
    Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。Redis的持久化机制有两种,第一种是RDB快照,第二种是AOF日志。快照是一次全量备份,AOF日志是连续的增量备份。快照是内存数据的......
  • 深入探讨Kafka消息时间戳与事件处理机制
    背景Kafka是一个高性能、分布式的消息队列系统,被广泛应用于大数据领域。在Kafka中,每个消息都有一个时间戳,用于表示消息的产生时间。在实际应用中,我们需要对消息进行处理,并根据时间戳进行相关的业务逻辑处理。本文将深入探讨Kafka消息时间戳与事件处理机制。Kafka消息时间戳在Kaf......
  • Qt程序框架的运行机制
    Qt程序框架程序入口当我们新建一个QtWidget工程的时候,会自动生成四个文件:main.cppwidget.hwidget.cppwidget.ui其中main.cpp是整个程序的入口,文件中只有一个简单的main()函数。#include"widget.h"#include<QApplication>#include<QLocale>#include<QTranslator......
  • JAVA17/JAVA21接口和多态机制
    day08-JAVAOOP课程目标1.【理解】什么是接口2.【掌握】接口的定义格式3.【掌握】接口的使用4.【理解】接口的成员特点5.【理解】类和接口抽象类和接口之间的关系6.【掌握】单继承多实现7.【理解】接口之间的多继承8.【掌握】接口的案例9.【理解】什么是多态......