MySQL入门笔记

article/2025/8/22 20:07:32

MySQL的逻辑架构

第一层:

       处理客户端连接、线程处理、身份验证、确保安全。每一个客户端都会在服务器进程中拥有一个线程,该连接的命令操作都只会在这个单独的线程执行。

第二层:

       MySQL服务器层。主要分为解析器、优化器。

查询解析、分析、优化、以及所有的内置函数(日期、时间、数字和加密函数),所有跨存储引擎的功能也在这一层:存储过程、触发器、视图等。

第三层:

       存储引擎层。存储引擎负责MySQL中数据的存储和读取。

并发控制

读写锁:

  • 读锁:也称共享锁,既然是共享锁,那么多个线程读取同一个资源是不影响且不阻塞的。
  • 写锁:也称排他锁,既然是排他锁,那么就是既会阻塞写入的线程也会阻塞读取的线程。

锁的粒度:

  • 行级锁,服务器中实现,开销最小,但并发最低。
  • 表锁,存储引擎级中实现,开销最大,但可以较大程度的支持并发。

MySQL的事务

       在我们尝试理解和学习事务的概念之前,我们必须要牢记“自动提交”这个概念。在MySQL中(InnoDB),实际上是默认开启了事务的,即自动提交模式,你在MySQL客户端上执行的插入、更新、删除语句,实际上会隐式的帮你在前后加上“START TRANSACTION”和“COMMIT”这两个开始事务和提交事务的命令。

       那么这里可以联想到在spring框架中的@Tansactional注解,它的作用便是帮我们开始一个多语句的事务,并帮我们提交或者在某一条语句失败时回滚事务。

      

       Spring事务注解解析,仅提到以下三个常用的属性:

       Propagation(事务的传播行为):

传播行为

说明

适用场景

REQUIRED(默认)

如果当前存在事务,则加入该事务;否则新建一个事务。

大多数业务方法适用。

SUPPORTS

如果当前存在事务,则加入;否则以非事务方式运行。

查询方法,允许非事务执行。

MANDATORY

必须在一个已有事务中运行,否则抛出异常。

强制要求事务的方法。

REQUIRES_NEW

始终新建事务,如果当前有事务,则挂起当前事务。

独立事务(如日志记录)。

NOT_SUPPORTED

以非事务方式执行,如果当前有事务,则挂起。

不涉及事务的操作。

NEVER

必须在非事务环境下执行,否则抛出异常。

禁止事务的方法。

       Isolation(事务的隔离级别):

隔离级别

说明

可能的问题

DEFAULT

使用数据库默认隔离级别(通常为 READ_COMMITTED)。

依赖数据库实现。

READ_UNCOMMITTED

允许读取未提交的数据(最低隔离级别)。

脏读、不可重复读、幻读。

READ_COMMITTED

只能读取已提交的数据(大多数数据库默认)。

不可重复读、幻读。

REPEATABLE_READ

确保同一事务多次读取结果一致(MySQL 默认)。

幻读(InnoDB 通过 MVCC 避免)。

SERIALIZABLE

完全串行化执行(最高隔离级别)。

性能低,无并发问题。

       RollbackFor(回滚条件):

       指定哪些异常触发回滚(默认仅RuntimeException和Error)。

原子性

       一组事务可以是一条sql也可以是多条sql的组合,这些sql组合要么全部提交成功,要么失败一条而全部回滚。

一致性

       拿转账的例子来说,一致性的意思就是A账户划走的钱,必然增加到了某一个B账户中。对于整个封闭系统来说,金额是恒定不变化。

隔离性

       通常来说,一个事务所作的修改在最终提交之前,对其他事务是不可见的。这是通常情况,实际情况取决于存储引擎配置和生效的隔离级别。

隔离级别就是用于定义事务之间的可见程度的。

ANSI SQL标准定义了4中隔离级别,并且隔离级别越来越高:

读未提交:

       顾名思义,即其他事务可以读取到当前事务还没有提交的改动。这样会导致其他事务读取到不正确的数据,成为“脏读”问题。

读已提交:

       既然读未提交的级别会产生脏读,那么更进一步的隔离级别就是读已提交。这个隔离级别会出现“不可重复读”的问题。

       试想,两个事务同时开始,事务A只需要执行一毫秒就完成并提交,事务B需要执行3毫秒才能完成并提交事务。那么在B事务开始前读取某个数据和它在第3秒中读取到的某个数据可能会出现不一致的情况,因为这个数据可能会因为事务A的提交而产生变化。

       同一个事务中两次执行相同的语句,可能会看到不同的数据结果。这就是不可重复读问题。

可重复读:

       那么为了解决不可重复读问题,标准又定义了可重复读的隔离级别。

       这个隔离级别保证了在同一个事务中多次读取相同行的结果是一样的。

       这是MySQL的默认隔离级别,但是还是会产生一个问题:“幻读”。幻读问题描述的不再是一行数据,而是强调的“行数”。在某个事务执行期间,如果相关表的行数发生了变化,则两次统计的结果也有可能不一致。可以理解幻读问题为“行数统计”的不可重复读问题。

       问题:MySQL是如何实现的可重复读???

       通过MVCC多版本并发控制策略,不同的事务根据自己的隔离级别可以看到不同版本快照的行记录数据。

       问题:MySQL是如何解决幻读问题的呢???

       通过间隙锁,InnoDB不仅锁定在查询中涉及到的行,还会对索引结构中间隙进行锁定,以防止幻行被插入。

串行化:

       既然以上隔离级别都会出现各种各样的问题,那么只有上最终杀器了:那就是串行执行。隔离级别描述的多个事务的可见性程度,那么只要控制事务串行执行,就不存在可见程度的问题了,因为同一时刻只有一个事务在运行。

       不过,这里说到的串行化,应该不是单纯的将MySQL服务器所有的事务都单线程执行。串行化级别下,会将涉及到的每一行数据上都会加锁,以此尽量缩小锁粒度,提高并发。

持久性

       一旦提交,事务所作的修改就被永久保存到数据库中。此时即使系统崩溃,数据也不会丢失。

多版本并发控制(MVCC)

       多版本并发控制,完整英文Multiversion Concurrency Control,多版本并发控制。

       mvcc的具体逻辑

       MVCC的工作原理是使用数据在某个时间点的快照来实现的,InnoDB引擎在每一个事务启动时分配一个事务id。当该事务中修改一条记录时,就会记录一条undo日志,并且该事务的回滚指针指向该undo日志,这样就可以实现读取到这条数据不同时间的版本的功能,这便是multi version的含义所在。

       当不同的会话读取聚簇索引记录时,InnoDB会将该记录的事务id与该会话的读取视图进行比较。如果当前状态下的记录不应该可见(更改它的事务尚未提交),那么将通过undo日志读取旧的版本,直到一个符合可见条件事务id。这个过程可以一直循环到完全删除这一行,然后向视图发出这一行不存在的信号。

       值得注意的是,所有undo日志的写入也都会写入redo日志。并且MVCC不适用于读未提交和串行化。

关键点:

  1. InnoDB 通过 undo logs 存储旧版本数据,支持事务回滚和一致性读(MVCC)。
  2. 每条记录包含 DB_TRX_ID(事务ID)和 DB_ROLL_PTR(回滚指针),指向 undo log 中的历史版本。
  3. 不同事务根据隔离级别(如 READ COMMITTED 或 REPEATABLE READ)访问合适的版本。

死锁、事务日志、复制、数据文件

       死锁:指的是两个或多个事务相互持有和请求相同资源上的锁,产生了循环依赖

       为了解决这个问题,数据库系统实现了各种死锁检查和锁超时机制。比如InnoDB存储引擎,检测到循环依赖后会立即返回一个错误信息;如果真遇到了死锁,它的处理方式是将持有最少行级排他锁的事务回滚(最少行级排他锁说明回滚的成本更低)

       事务日志:InnoDB存储引擎只需要更改内存中的数据副本,而不用每次修改磁盘中的数据,在每次修改内存数据前,记录事务日志,这种方式称为“预写式日志”,尽管实际数据没有落盘,但是通过事务日志仍可以在系统崩溃的情况下恢复数据到最新状态。

       这里需要注意,事务日志是写入到磁盘,它比实际数据写入磁盘的成本更低,因为事务日志都是在磁盘的一小块顺序I/O,而实际数据需要根据存储引擎控制磁盘的写入,并且一般情况都是随机I/O。

       复制:MySQL被设计为只能在一个节点上进行写操作,即“一主多副本”的架构,那么为了保证其他副本上的数据和主上的一致,MySQL实现了一种原生的数据同步操作,(注意这里不是直接同步数据,而是将一个节点执行的写操作分发到其他节点)称为复制。源节点为每一个副本节点提供一个线程,当写操作发生时唤醒这些线程,实现数据的同步。

       隐式锁定和显式锁定

       隐式锁定:InnoDB使用两阶段锁定协议(two-phase locking protocol)。在事务执行期间,随时都可以获取锁,但只有在提交或者回滚后才释放,并且所有的锁会同时释放。这部分锁定机制都是隐式的。InnoDB会根据隔离级别自动处理锁。

       隐式锁定:InnoDB还支持通过特定语句显示锁定:

       Select …… for update;

       Select …… for share;    (8.0才支持,之前的语句为Select …… lock in share mode;)

8.0版本的升级

主要变化可以总结为Schema数据InnoDB化。

  1. 性能优化、安全性增强
  2. 删除了缓存
  3. 默认字符集修改为utf8mb4(占四字节,可以存储emoji,之前的默认字符集为utf8,属于阉割版只占3字节),默认排序规则修改为utf8mb4_0900_ai_ci:基于 Unicode 9.0 标准,更准确
  4. 表元数据InnoDB化

        8.0版本删除了基于文件的表元数据存储,并使用InnoDB引擎的表存储,使得 DDL语句的执行可以享受事务带来的稳定性。

  1. JSON数据结构的原生支持,以及相关函数和索引
  2. 引入了原子数据定义更改(原子DDL)

        DDL语句的执行要么全部成功,要么失败回滚。


http://www.hkcw.cn/article/xooRxxlbed.shtml

相关文章

纤维组织效应偏斜如何影响您的高速设计

随着比特率继续飙升,光纤编织效应 (FWE) 偏移,也称为玻璃编织偏移 (GWS),正变得越来越成为一个问题。今天的 56GB/s 是高速路由器中最先进的,而 112 GB/s 指日可待。而用于个人计算机…

wechat-003-学习笔记

1.路由跳转页面:携带的参数会出现在onlaod中的options中。 注意:原生小程序对路由传参的长度也有限制,过长会被截掉。 2.wx.setNavigationBarTitle(Object object) 动态设置当前页面的标题 3.在根目录中的app.json文件中配置 后台播放音乐的能…

瞬时高温 15 秒合成过渡金属磷化物,开启高效析氢新征程

在碳中和目标的驱动下,开发高效清洁能源技术已成为全球科学界与工业界的共同使命。过渡金属磷化物(TMPs)因其优异的导电性和催化活性,被视为电解水制氢、燃料电池等能源器件的理想电催化剂。然而,传统合成方法依赖数小…

外贸邮件营销推广怎么做才有效果?

一、精准定位 1.细分客户群体:按客户行业、采购规模、地理位置等划分群体,制定差异化策略。 2.动态内容适配:借助邮件营销工具变量插入功能,依客户信息生成个性化内容。 3.合规性保障:遵守GDPR、CAN-SPAM等国际法规…

c#跨平台桌面地图-mapsui

c#跨平台桌面系统 目前c#的跨平台有几种方式,这里还是以前介绍的Avalonia结合,使用地图,前面已经有一点介绍提供一个加载,但是现在都是发展阶段,版本修改比较大,可能在一段时间后新版的接口就变了&#xf…

使用python rembg模块移除图片背景

安装 rembg模块 pip install rembg 代码实现 #移除图片背景 from rembg import remove from PIL import Imageinput_pathimg/1.png output_pathimg/2.png inpImage.open(input_path) outputremove(inp) output.save(output_path) Image.open(output_path) 3.运行代码结构如…

捌拾陆- 海森堡不确定性原理

继续学习 Hello,我又来了,又来一个简单的(看到后续的非常复杂,所以先不看先) 又是一个物理理解的基础 海森堡不确定性原理 有时候真搞不懂,大学学完的东西为什么现在就是完全忘记了 另外还得有空复习一下…

胖东来红内裤当事人被判赔40万 名誉侵权案落锤

许昌市魏都区人民法院于2025年5月28日公开审理了原告许昌市胖东来商贸集团有限公司与被告段某的名誉权纠纷案,并当庭宣判。法院判决段某在其个人抖音账号“两个小段(小)”发布书面道歉信视频,内容需经法院审核,且30日内不得删除;段某还需赔偿许昌市胖东来商贸集团有限公司…

长安链智能合约命令解析(全集)

创建命令解析 ./cmc client contract user create \ --contract-namefact \ --runtime-typeWASMER \ --byte-code-path./testdata/claim-wasm-demo/rust-fact-2.0.0.wasm \ --version1.0 \ --sdk-conf-path./testdata/sdk_config.yml \ --admin-key-file-paths./testdata/cryp…

wails3学习-打包(wails3 package)

nsis不太会用,先记录基础,后面再补充吧~ 检查NSIS 在cmd/powershell中运行 wails3 doctor如果你已经安装nsis但运行wails3 doctor仍然提示未安装,需要配置环境变量,根据自己的实际情况配置,配置完成,重启…

Next.js 布局(Layout)与模板(Template)深度解析:从原理到实战

在 Next.js 应用开发中,页面结构的组织方式直接影响用户体验和开发效率。Layout 和 Template 作为 Next.js 提供的两种页面结构组织方案,它们的正确使用能够显著提升应用的性能表现和开发体验。本文将深入剖析两者的区别、工作原理以及最佳实践&#xff…

吴艳妮获亚锦赛100米栏季军 微弱差距摘铜

5月29日,在韩国龟尾市举行的第26届亚洲田径锦标赛女子100米跨栏决赛中,中国选手吴艳妮以13秒068的成绩获得季军,仅比日本选手田中佑美慢了千分之七秒。印度选手亚拉吉以12秒96的成绩卫冕,并刷新了赛会纪录,田中佑美以13秒061摘得银牌,另一名中国选手刘景扬以13秒32的成绩…

RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包,并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…

Swift 解锁 LeetCode 热门难题:不改数组也能找出重复数字?

文章目录 摘要描述题解答案题解代码分析解读: 示例测试及结果时间复杂度空间复杂度总结实际场景类比可运行 Demo(Swift Playground)未来展望 摘要 在数组中找出唯一的重复数字,听起来像一道简单的题目,但如果你不能修…

防范DDoS攻击,服务器稳定性崩溃的根源与高效防御对策

DDoS攻击(分布式拒绝服务攻击)已成为危害服务器稳定性和业务连续性的主要因素之一。本文将深入探讨为什么服务器一遇到DDoS攻击就崩溃,以及如何从根本上实现有效防御和应对这一威胁,帮助企业提升网络安全水平。 具体内容如下&…

女农机手再度为困难农户收麦 跨省公益收割500亩

姜晓娜曾是一名美甲师,如今她已成为一名熟练的农机手,驾驶着3米高的收割机在麦田劳作。她的态度认真,不敷衍、不马虎,赢得了“干得好、割得快、不撒粮、长得俊”的评价。这些夸奖和赞美是她前进的动力。河南省是我国粮食大省,5月24日至28日,姜晓娜和弟弟在河南平顶山、驻…

iVX 如何用 VL 中间语言构建程范式闭环?

一、技术定位:VL 中间语言的「三位一体」技术闭环 在数字化转型浪潮中,iVX 自主研发的 VL(Visual Language)中间语言体系,正通过 "可视化建模→VL 编译→多语言生成" 的技术闭环,重新定义图形化…

今日行情明日机会——20250529

上证指数放量收阳线,个股涨多跌少,汽车主线方向凸显。 深证指数放量收阳线,可以围绕主线方向做。 2025年5月29日涨停股主要行业方向分析 1. 智能驾驶(政策场景商业化突破) 涨停家数:24家。 代表标…

Arduino门禁系统:RFID-RC522卡验证与LED、0.96OLED(IIC)的门禁场景

引言 在物联网和智能家居日益普及的今天,门禁系统作为安全防护的第一道关卡,有着广泛的应用需求。本文将介绍如何利用 Arduino Uno 开发板,结合 0.96 寸 OLED 显示屏、RC522 RFID 模块以及红绿 LED 灯,搭建一个简易的门禁系统&am…

各地狂建学职业本科成香饽饽,职业本科怎么就成了香饽饽?

各地狂建学职业本科成香饽饽。毕业季,当许多高校学生还在忙着找工作时,西安汽车职业大学2023届智能制造工程学院的毕业生乔延哲,在6月离校前就拿到了10余个Offer,被多家企业争抢,而类似的例子还有许多。大众在不解的同时也感叹,职业本科怎么就成了香饽饽?2025年了,各地…