Mvcc--mysql详解(十一)

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS AI 助手,专业版
简介: Mvcc--mysql详解(十一)

上篇文章说了为了解决mysql原子性,于是undo日志来记录需要回滚的数据,首先回滚不需要考虑select,每行数据都有roll_pointer指针,指向insert undo日志,updatedeleteinsert是不同的,多一个old_roll_pointer指向需要回滚的日志,update分为主键更新和非主键更新,减少不必要的重排序性能消耗。

Undo日志--mysql详解(十)


Mvcc


全称是multi-version concurrency control,多版本并发控制。


当我们并发执行会发生什么问题呢?

脏读:当一个事务读取了另一个事务里未提交的数据,甚至在另一个事务发生了回滚,这个数据并不存在。


不可重复读:在一个事务里,每次读取都是其他事务最新值,而导致在每次查询的值每次都不一致。


幻读:在一个事务里,每次查询的记录数不一样,有的时候多,有的时候少,针对于新增和删除。(一个事务先查询一些数据,另一个事务又向表里插入新数据,这时候在第一个事务查询的值增多)


四种隔离级别:

Read uncommit:存在以上三个问题。

Read commit:解决脏读。

Repeatable read:解决不可重复读,每次select都是不同的数据,被其他事务所修改。

Serializable:串行化,各种问题都不会发生,效率低。


隔离级别可以通过set transaction isolation level serializable,查看可以用show

Variables like transaction_isolation;

对于serializable隔离级别的事务,采用的是加锁方式解决的,对于read uncommitcommit

Repeatable read级别采用的是readView

M_ids:表示系统中活跃的读写事务id列表。

Min_trx_id:表示活跃中的最小事务id。(m_ids里最小值)

max_trx_id:表示应该分配给下一个事务的id。(不在m_ids里)

Creator_trx_id:表示生成该readView的事务id


他的过程就是当前事务会与这些字段来判断:

当当前事务小于最小事务id的时候,代表已经被提交,可以被访问。


当当前事务大于最大事务id的时候,表示事务在之后才开启,不可以被访问。


如果在之间,则判断是都在m_ids活跃列表里,在的话不可以访问,不在则可以访问。


Read commitrepeatable不同的是,readview生成时机不同,前者是每次select都会生成readView,后者只有第一次select会生成,后面重复使用。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
缓存 小程序 JavaScript
从零开始搭建uni-app框架的小程序开发环境
从零开始搭建uni-app框架的小程序开发环境
1431 0
从零开始搭建uni-app框架的小程序开发环境
|
C语言
【C语言】条件运算符详解 - 《 A ? B : C 》
条件运算符(也称为三元运算符)是C语言中唯一的三元运算符。它通常用于替代简单的 `if-else` 语句。
1470 6
|
存储 Java 数据处理
DO/SDO/DTO/VO 都是什么
【5月更文挑战第7天】DO/SDO/DTO/VO 都是什么
590 2
|
前端开发 Ubuntu PHP
在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上
在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上
445 0
CocosCreator 面试题(二十) Cocos creator 如何实现一个置灰Shader?
CocosCreator 面试题(二十) Cocos creator 如何实现一个置灰Shader?
736 0
|
消息中间件 移动开发 自然语言处理
Java8Streams流groupBy详解
本文我会给大家详细讲解下 Streams 流相关的分组操作。 假设我们有一组学生,需要按年龄对他们进行分组。按照 Java 得传统方式,我们可能需要好几个步骤。 如果我说,使用流分组,我们可以用 1 行代码来完成此操作呢?是不是很神奇?让我们来看看。 Streams 得 collect 方法接受一个 Collector 参数。该方法可以接收分组对象。 Collectors 类中分组相关的 3 个方法如下所示,
633 1
|
JSON 监控 数据格式
Ansible 学习笔记 - 批量巡检站点 URL 状态
Ansible 学习笔记 - 批量巡检站点 URL 状态
|
消息中间件 监控 Java
一次线上Flink 背压情况分析之重新认识java dump 文件
一次线上Flink 背压情况分析之重新认识java dump 文件
552 0
|
传感器 移动开发 IDE
RT-Thread I2C总线设备学习笔记
RT-Thread I2C总线设备学习笔记
356 0
|
Arthas 安全 Java
Linux环境下使用Arthas排查cpu飙高问题
Linux环境下使用Arthas排查cpu飙高问题
Linux环境下使用Arthas排查cpu飙高问题

热门文章

最新文章