mysql是怎样运行的-从根儿上理解mysql学习笔记(四)

MySQL 是怎样运行的:从根儿上理解 MySQL(上).pdf 立即下载

说明

本文是《MySQL是怎样运行的-从根儿上理解MySQL》的学习笔记,文中的图全部来自于这本书,强烈建议买一本看看,对MySQL理解会特别深入,非常感谢作者"小孩子4919"。

第十八章 事务

事务的四大特性

  • 原子性
    事务中的操作要么全部执行成功,要么失败全部回滚.
  • 一致性
    事务需满足一定的约束
  • 隔离性
    两个事务在执行过程中互不干扰
  • 永久性
    一旦事务执行成功,对数据库的影响是永久的

事务的状态转换

在这里插入图片描述

图18-3 事务的状态转换图

第二十一章 事务的隔离级别和MVCC

事务并发执行时遇到的一致性问题

  • 脏读
    一个事务读取到了另一个未提交事务修改的数据,意味着发生了脏读.

  • 不可重复读
    如果一个事务修改了另一个未提交事务读取的数据,就意味着发生了不可重复读.

  • 幻读
    如果一个事务先根据某些搜索条件查询出一些记录,在该事务未提交时,另一个事务写入了一些符合哪些搜索条件的记录,就意味着发生了幻读.

事务的隔离级别

mysql定义了4中隔离级别

表21-1 SQL标准中规定的并发事务执行过程中可能发生的现象
隔离级别脏读不可重复读幻读
READ UNCOMMITTED(读未提交)可能可能可能
READ COMMITTED(读已提交)不可能可能可能
REPEATABLE READ(可重复读)不可能不可能可能
SERIALIZABLE(串行化)不可能不可能不可能

MVCC原理

版本链

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

  • trx_id
    一个事务对某条记录进行修改时,都会把该事务的事务id赋值给trx_id
  • roll_pointer
    每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中.这个隐藏列相当于一个指针,通过它可以找到该记录修改前的信息.
CREATE TABLE student(
sno int(10) NOT NULL AUTO_INCREMENT,
sname varchar(100),
age int(4),
PRIMARY KEY (`sno`)
));
INSERT INTO student VALUES(null, 's3', 12);

假设插入之后两个事务id分别为100和200的事务对这条记录进行UPDATE操作,操作流程如图21-3所示.
在这里插入图片描述

图21-3 UPDATE 操作流程
每个事务对一条记录进行每一次改动,都会记录一条undo日志,每条undo日志也有一个roll_pointer指针,通过这个属性可以将这些undo日志串成一个链表,这个链表称为**版本链**.将利用这个记录的版本链来控制并发事务访问相同记录时的行为称为多版本并发控制(Multi-Version Concurrency Control MVCC). 现在,这条记录的版本链如图21-6所示。

在这里插入图片描述

sno=1的记录的版本链

ReadView

对于InnoDB存储引擎来说,可重复读和读已提交都是通过ReadView实现的,下面就来介绍ReadView,它包含以下四个方面的内容

  • m_ids
    生成ReadView时活跃事务的id列表.活跃的事务是指未提交的事务
  • min_trx_id
    生成ReadView时活跃事务id的最小值,也就是m_ids的最小值
  • max_trx_id
    当前系统中应该分配给下一个事务的事务id值
  • creator_trx_id
    生成该ReadView的事务的事务id

事务隔离级别的核心问题是:版本链中那个版本对当前事务是可见的.有了ReadView就可以很方便判断,判断条件如下:

  • 如果被访问记录的trx_id值与ReadView中creator_trx_id相同,说明是当前事务修改的记录,则该版本当前事务可见;
  • 如果被访问记录的trx_id值小于min_trx_id,说明生成ReadView时该记录已经提交,则该版本当前事务可见;
  • 如果被访问记录的trx_id值大于或等于max_trx_id值,说明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本对当前事务不可见;
  • 如果被访问记录的trx_id值介于min_trx_id和max_trx_id之间,则判断trx_id是否在m_ids中,如果在,说明生成该版本事务是活跃事务,对当前事务不可见;如果不在,说明创建ReadView时生成该版本事务已经提价,该版本对当前事务可见.

总结
如果trx_id>=max_trx_idtrx\_id>=max\_trx\_idtrx_id>=max_trx_id或者trx_id>min_trx_id且trx_id<=max_trx_idtrx\_id>min\_trx\_id 且 trx\_id<=max\_trx\_idtrx_id>min_trx_id且trx_id<=max_trx_id,则该版本对当前事务不可见.如果某个版本对当前事务不可见,那么沿着版本链往下找到可见的版本,如果找到最后一条版本链还是不可见,那么该记录对当前事务不可见.
读已提交和可重复读区别在于,读已提交在事务每次SELECT语句时都会生成ReadView,而可重复读只在第一次SELECT时生成,此后不再发生变化.

第二十二章 锁

InnoDB中的锁

行锁

  • 记录锁
    最普通的锁,包括读锁S和写锁X
  • 间隙锁
表22-7 间隙锁示例
snoname
1s1
2s2
3s3
8s4

如果对sno=8的记录加上间隙锁,那么当前事务在未提交前,其他事务无法插入sno列值处于区间(3,8)(3,8)(3,8)的记录,这就是间隙锁.mysql的间隙锁是为了解决部分幻读问题.

  • 临键锁
    有时候又想锁住某一条记录,又想阻止其他事务在该记录前面插入新记录,就可以对该记录加临键锁.也就是说,临键锁=记录写锁+间隙锁
  • 插入意向锁
    事务在等待加锁生成的锁称为插入意向锁

表锁

  • 表读写锁
    事务可以对整张表加读锁或者写锁.表级别的写锁与记录锁不兼容,表级别的读锁与记录读锁兼容
  • 表级别意向锁
    表级别的写锁与记录锁不兼容,那么在进行表级别加锁时怎么知道每一条记录是否加读写锁,InnoDB规定记录读锁加成功后也会加表级别的意向读锁IS,记录写锁加成功后也会加表级别的意向写锁IX.表级别的IS和表级别的读锁兼容,表级别的写锁和意向锁都不兼容
MySQL 是怎样运行的:从根儿上理解 MySQL(下).pdf 立即下载

相关推荐

MySQL是怎样运行的(仅限学习使用)

MySQL是怎样运行的(仅限学习使用)

《Mysql是怎样运行的》

mysql安装、系统变量、字符集和比较规则、InnoDB、B+树索引、数据目录、表空间、连接原理、成本优化、sql优化、explain使用、事务

qq_35572013的博客 5106

MySQL学习资料PDF

MySQL必知必会.pdf 高性能MySQL(第3版).pdf MySQL 技术内幕:InnoDB存储引擎.pdf

《MySQL是怎么运行的》阅读笔记

Mysql是由两部分构成,一部分是服务器程序,一部分是客户端程序。服务器程序又包括两部分:第一部分server层包括连接器、查询缓存、分析器、优化器、执行器等。涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等第二部分是存储引擎层负责数据的存储和提取。存储引擎有多种选择,主要有InnoDB、MyISAM、Memory等。要操作Mysql数据库,首先客户端要连接上mysql服务器程序。

qq_44788518的博客 2616

MySQL是怎样运行的:从根儿上理解MySQL

MySQL是怎样运行的:从根儿上理解MySQL

嵌入式工程师必看:BLDC电机驱动电路设计全流程(附MOS管选型指南)

本文为嵌入式工程师提供了BLDC电机驱动电路设计的全流程实战指南。文章深入解析了三相全桥逆变电路的核心原理,并重点阐述了功率MOSFET的选型关键参数,如Vds、Rds(on)和Qg。同时,详细介绍了栅极驱动设计、PCB布局布线要点及调试安全步骤,旨在帮助开发者构建稳定高效的BLDC驱动系统。

weixin_29194817的博客 587

MySQL 是怎样运行的:从根儿上理解 MySQL

MySQL 是怎样运行的:从根儿上理解 MySQL小孩子 著12 小时 · 25 小节从根儿上理解 MySQL,让 MySQL 不再是一个黑盒小册内容小册介绍MySQL...

codehole_的博客 9668

ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出

之前一直没太了解 RFSoC 的DAC如何输出在 Fs/2 到 Fs 频率范围内的信号,例如 ZCU216中的 ZU49DR,其RF-DAC最大采样率是 9.85GSPS,如果想输出的信号中心频率在5.8G,它是如何有效输出在第二奈奎斯特区域范围的信号的。

weixin_44630490的博客 1551

mysql是怎样运行的 从根儿 百度云_MySQL 是怎样运行的:从根儿上理解 MySQL|完结|百度云下载...

-代码开始-/MySQL 是怎样运行的:从根儿上理解 MySQL [13.8M]┣━━[天下无鱼][shikey.com]0万里长征第一步(非常重要) —— 如何愉快的阅读本小册(01).md [9.8K]┣━━[天下无鱼][shikey.com]0万里长征第一步(非常重要) —— 如何愉快的阅读本小册(02).pdf [617.3K]┣━━[天下无鱼][shikey.com]10条条大路通罗马 ...

weixin_35203997的博客 7326

基于FPGA的DDS信号发生器

之前的博客讲到了DDS的基本原理,现在用Verilog代码实现DDS,能够产生四种波形,方波,三角波,正弦波,锯齿波,用按键来控制频率和选择波形。其中按键消抖模块来自小梅哥的FPGA自学笔记设计与验证这本书。 module DDS_Module( Clk, Rst_n, EN, Fword, Key1, Pword, DA_Clk, DA_Data ); input Clk...

qq_43534451的博客 9949

关于使用vcpkg下载osgearth遇到的问题

注意--x-manifest-root=后面跟着的E:\gitproject\osgearth-osgearth-3.5\vcpkg是你下载的源码解压缩后vcpkg.json的文件地址,然后等待编译完成。安装vcpkg后使用vcpkg install osgearth:x64-windows安装好osgearth并且导入项目使用时,发现无法运行官方文档中示例的main.cpp。这里写一种自己用过的使用vcpkg安装osgearth3.5的方法,源码,打开vcpkg所在的命令行,执行。示例main.cpp。

m0_61776040的博客 1524

MySQL 是怎样运行的:从根儿上理解 MySQL(上)

MySQL 是怎样运行的:从根儿上理解 MySQL(上) 【下载地址】MySQL是怎样运行的从根儿上理解MySQL上 《MySQL 是怎样运行的:从根儿上理解 MySQL(上)》是一份深入浅出的教程,全面剖析了MySQL数据库的运行原理。本教程以通俗易懂的语言,帮助读者从源头理解MySQL,为之后的学习和实践打下坚实基础...

gitblog_06708的博客 479

手把手教你校准垂起固定翼(VTOL)遥控器与电调:从零到飞的完整流程

本文详细介绍了垂起固定翼(VTOL)遥控器与电调的校准流程,从基础认知到飞行前检查,涵盖遥控器通道配置、电调校准、舵机方向调整等关键步骤。通过图文并茂的指导,帮助无人机爱好者安全完成VTOL调试,确保首飞成功。特别强调多旋翼模式、过渡模式和固定翼模式的设置要点,适合新手和进阶用户参考。

jenkins8butler的博客 355

MySQL 是怎样运行的:从根儿上理解 MySQL(下)

MySQL 是怎样运行的:从根儿上理解 MySQL(下) 【下载地址】MySQL是怎样运行的从根儿上理解MySQL下 《MySQL 是怎样运行的:从根儿上理解 MySQL(下)》是一份深入浅出的学习资料,帮助读者全面理解 MySQL 数据库的内部工作原理。内容涵盖存储引擎、索引原理与优化、SQL 语句执行过程、事务与锁的...

gitblog_06749的博客 472

【020】C++ 动态内存管理解析:new 和 delete 的正确使用

C++中的动态内存分配是在程序运行时根据需要进行内存空间的分配和释放,与静态内存分配相比,具有更大的灵活性和适应性。动态内存分配可以通过new和delete或者malloc()和free()等函数实现。在程序运行时无法确定所需的内存大小。需要在多个函数之间共享数据,并且数据可能被频繁地创建和销毁。静态数组无法满足需求,例如需要支持可变长度数组。如果在动态分配内存后忘记了释放它,则会导致内存泄漏。为避免内存泄漏,可以使用智能指针或手动管理内存的方式来释放动态分配的内存。

Lion_Long的博客 1470

【AI智能体】Codex 基于Git 实现项目管理实战操作详解

Codex 基于Git 实现项目管理实战操作详解

congge 5454

MySQL是怎样运行的:从根儿上理解MySQL | 锁

文章目录前言:本博文是对MySQL是怎样运行的:从根儿上理解MySQL这本书的归纳和总结第25章 工作面试老大难-锁1.解决并发事务带来问题的两种基本方式1.1 并发事务访问相同记录的情况的三种情况 前言:本博文是对MySQL是怎样运行的:从根儿上理解MySQL这本书的归纳和总结 第25章 工作面试老大难-锁 1.解决并发事务带来问题的两种基本方式 1.1 并发事务访问相同记录的情况的三种情况 ...

光看不点赞的博客 5969

RNA-seq分析:Step4(比对)

预处理之后的fastq文件,可以使用HISAT2软件将reads比对至参考基因组上。HISAT2软件将reads比对至参考基因组上的步骤如下:1. 对参考基因组进行建索引。对参考基因组进行预处理,生成索引文件,包括基因组序列的FM索引和SA索引。2. 将原始的reads进行预处理。包括去除接头序列、去除低质量的碱基,以及进行过滤,得到质量较高的、可靠的reads。3. 利用建立的FM索引和SA索引,将处理后的reads与参考基因组进行比对。首先,通过FM索引,快速找到与reads匹配的可能位置;

沉香best的博客 2599

【亲测免费】 《MySQL是怎样运行的:从根儿上理解MySQL》PDF下载

《MySQL是怎样运行的:从根儿上理解MySQL》PDF下载 【下载地址】MySQL是怎样运行的从根儿上理解MySQLPDF下载 《MySQL是怎样运行的:从根儿上理解MySQL》是一本深入解析MySQL数据库内部机制的书籍,适合希望从底层原理到实际应用全面掌握MySQL的读者。本书详细介绍了MySQL的架构设计、存储引...

gitblog_06714的博客 1388

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

转:MySQL 是怎样运行的:从根儿上理解 MySQL

转:MySQL 是怎样运行的:从根儿上理解 MySQL

baidu_37307156的博客 9181

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

MySQL是怎样运行的从根儿上理解MySQL下:深入掌握数据库核心奥秘

MySQL是怎样运行的从根儿上理解MySQL下:深入掌握数据库核心奥秘 【下载地址】MySQL是怎样运行的从根儿上理解MySQL下 《MySQL 是怎样运行的:从根儿上理解 MySQL(下)》是一份深入浅出的学习资料,帮助读者全面理解 MySQL 数据库的内部工作原理。内容涵盖存储引擎、索引原理与优化、SQL 语句执行过...

gitblog_06713的博客 433

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL是怎样运行的:从根儿上理解MySQL|MySql事务简介

19.从猫爷被杀说起-事务简介 1.事务的起源 这里书中讲述的十分生动有趣,大家可自行下载pdf查阅理解;总结来说所谓事务就是:让某些数据库操作符合现实世界中状态转换的规则 1.1 原子性(Atomicity) 概述 现实世界中转账操作是一个不可分割的操作,也就是说要么压根儿就没转,要么转账成功,不能存在中间的状态,也就是转了一半的这种情况。设计数据库的大叔们把这种要么全做,要么全不做的规则称之为 原子性,但麻烦就麻烦在现实生活中一步的操作要在数据库分为好几步来实现,其中一环断开则会引发意想不到的

光看不点赞的博客 3316
上一篇: mysql是怎样运行的-从根儿上理解mysql学习笔记(三)
下一篇: 腾讯云开发者社区文章迁移
spencersong
博客等级 码龄9年 11粉丝 14原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值