首页 > 数据库 >【MySQL】MVCC机制、ReadView数据结构、匹配规则详解

【MySQL】MVCC机制、ReadView数据结构、匹配规则详解

时间:2023-11-05 21:33:17浏览次数:53  
标签:事务 快照 ReadView trx MVCC MySQL id

(目录)


MySQL MVCC机制

image-20230701150505357

1.隔离级别

img

在MySQL InnoDB存储引擎下,RC、RR基于MVCC(多版本并发控制)进行并发事务控制

MVCC是**基于”数据版本”**对并发事务进行访问

2.场景分析

img

img

img

UNDO_LOG不是会被删除吗?中间数据万一被删了版本链不就断了?

UNDO_LOG版本链不是立即删除,MySQL确保版本链数据不再被“引用”后再进行删除

ReadView

ReadView是“快照读”SQL执行时MVCC提取数据的依据.

快照读就是最普通Select查询SQL语句

当前读指代执行下列语句时进行数据读取的方式

InsertUpdateDelete

Select...for update

Select...lock in share mode

1.ReadView数据结构

ReadView是一个数据结构,包含4个字段

  • m_ids:当前活跃的事务编号集合
  • min_trx_id:最小活跃事务编号
  • max_trx_id:预分配事务编号,当前最大事务编号+1
  • creator_trx_id:ReadView创建者的事务编号

2.Read view匹配条件规则

  1. 如果数据事务ID trx_id < min_limit_id,表明生成该版本的事务在生成Read View前,已经提交(因为事务ID是递增的),所以该版本可以被当前事务访问。
  2. 如果trx_id>= max_limit_id,表明生成该版本的事务在生成ReadView后才生成,所以该版本不可以被当前事务访问。
  3. 如果 min_limit_id =<trx_id< max_limit_id,需腰分3种情况讨论
  • (1).如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
  • (2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
  • (3).如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。

3.读已提交(RC):在每一次执行快照读时生成ReadView

img

imgimg

4.可重复读(RR):仅在第一次执行快照读时生成ReadView,后续快照读复用

img

RR级别下使用MVCC能避免幻读吗

能,但不完全能!

  1. 连续多次快照读,ReadView会产生复用,没有幻读问题
  2. 当两次快照读之间存在当前读,ReadView会重新生成,导致产生幻读
  3. MVCC 只能保证用户并发修改数据时的快照读

img

标签:事务,快照,ReadView,trx,MVCC,MySQL,id
From: https://blog.51cto.com/panyujie/8195803

相关文章

  • MySQL教程:缓冲池Buffer Pool详解
    用于存储数据库的数据页和索引页查看缓冲池的大小showvariableslike'innodb_buffer_pool_size';查看缓冲池的使用情况showengineinnodbstatus;分析缓冲池命中率showstatuslike'innodb_buffer_pool_hit_rate';缓冲池满了LRU内存淘汰策略最近最少使用写回策略......
  • MySQL教程:如何更改mysql root密码
    要更改MySQL的root密码,你可以按照以下步骤进行操作:打开命令行终端或MySQL客户端工具。使用root用户登录到MySQL服务器。如果MySQL服务器已经在本地运行,并且你已经安装了MySQL客户端,则可以在终端中执行以下命令:mysql-uroot-p```系统将提示你输入密码。如果你之前没有设置过密......
  • mysql教程:更改数据页的大小(innodb_page_size)
    修改注意:更改innodb_page_size参数后,需要重新编译mysql的源码才能生效。在MySQL中,更改数据页的大小涉及到重新创建数据库的过程,因为数据页大小是在数据库创建时确定的,并且不能直接更改。以下是一般的步骤:备份数据库:在进行任何结构更改之前,强烈建议备份数据库以防止数据丢失。停止My......
  • mysql教程:binlog日志和数据备份
    DMLDDL数据恢复、主从复制数据备份:全量备份、增量备份数据恢复的步骤:备份数据库–还原数据文件–应用binlog–验证数据mysqlbinlog工具、将备份后的修改操作应用到数据库,将数据库恢复到最新的状态数据库的完整性、一致性binlog和数据备份数据备份是将数据库的数据文件复制到另......
  • Java+Jsp+MySQL高校选课系统设计与实现(附源码下载地址)
    @目录01源码下载02系统概述03开发工具及技术选型04运行环境05用户分析06功能分析07数据库设计08项目工程结构及说明09部分功能展示及源码9.1管理员端--首页9.2管理员端--专业管理9.3管理员--课程管理9.4管理员端--统计信息9.5普通用户端--基本信息9.6普通用户端--......
  • MySQL日期时间操作函数(全的)-九五小庞
    一、MySQL常用日期函数1.1、获取时间#获取当前日期时间selectNOW();#2021-04-0209:25:29#获取当前日期SELECTCURDATE();#2021-04-02#获取当前时间SELECTCURTIME();#09:26:10#对于时间2021-04-0209:25:29,分别获取其年、月、日、时、分、秒SELECTEXTRAC......
  • mysql读写分离
    ####在企业生产环境中,mysql架构采用主从模式,业务系统连接数据库;1)业务系统连接mysql,master主库;2)mysql从库是跟master主库进行数据同步;3)如果master主机宕机,业务系统怎么操作?4)可以修改业务系统的数据库配置ip为mysqlslave从库;5)不管主从如何切换,业务系统读、写请求只会发给一台......
  • mysql正则表达式替换
    MySQL正则表达式替换在MySQL中,正则表达式替换是一种强大的功能,它可以帮助我们快速、灵活地对字符串进行处理和修改。本文将介绍MySQL中如何使用正则表达式替换,并提供一些实际的代码示例。什么是正则表达式?正则表达式(RegularExpression)是一种用于描述模式匹配的字符串。它由正则表......
  • 如果它是MySQL中的特定字符,则删除最后一个字符?
    要删除最后一个字符(如果是特定字符),请使用SUBSTRING()。让我们首先创建一个表-mysql>createtableDemoTable(SubjectNamevarchar(100));使用插入命令在表中插入一些记录-mysql>insertintoDemoTablevalues('MySQL');mysql>insertintoDemoTablevalues('MongoD......
  • mysql删除指定结尾的字符串
    要删除内容结尾的指定字符串,只删除最结尾的部分,可以使用以下方法:UPDATEdede_addonarticleSETbody=REGEXP_REPLACE(body,'#p#分页标题#e#$','')WHEREREGEXP_LIKE(body,'#p#分页标题#e#$')andaid=144UPDATEdede_addonarticleSET`body`=REGEXP_REPLACE(body,'......