MySQL事务,锁,MVCC总结
mysql中最重要的就是事务,其四大特性让我们维持了数据的平衡,一致。那么事务究竟是什么,与什么相关,他的使用步骤,以及使用过程中我们会遇到什么问题呢?下面我们一起学习交流!
1.MySQL的存储引擎:
存储引擎是数据库底层软件组织,数据库管理系统使用存储引擎存储,管理数据,不同的存储引擎提供不同的功能(存储机制,索引技巧,锁定水平)。
MySQL提供了许多不同的存储引擎,如InnoDB,MyISAM,此处我们只这两种作对比
| 对比项 | MyISAM | InnoDB |
| 外键 | 不支持 | 支持 |
| 事务 | 不支持 | 支持 |
| 行表锁 | 表锁,即使操作一条记录也会所著整个表,不适合高并发操作 | 行锁,操作时治所铸某一行,不对其他行有影响,适合高并发操作 |
| 缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
| 默认安装 | Y | Y |
| 默认使用 | N | Y |
| 关注点 | 性能:节省资源,消耗少,简单业务 | 事务:并发写,事务,更大资源 |
2.什么是事务,事务的特点,限制
事务:就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行
事务特点:一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。
限制:MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务
3.MySQL开启事务的步骤
-- 1.关闭MySQL自动提交
set autocommit=0;
-- 2.开启一个事务,标志事务的起始点
start transaction;-- 一组SQL语句-- 结束事务,逻辑判断if 条件-- 向数据库提交事务commit;else -- 将事务回滚,所有的数据库操作取消rollback;-- 开启MySQL自动提交
set autocommit=1
4.事务的四大特性:
原子性:数据库中的事务执行是作为原子粒度,即不可再分,整个语句要莫执行,要莫不执行
一致性:即事务开始之前和事务结束之后,数据库的完整性约束没有被破坏
隔离性:事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一刻的数据
持久性:事务完成后,该事务对数据库所做的更改便持久的保存在数据库中,并不会回滚
5.事务日志以及其和四大特性的关系:
Redo log(重做日志):提供再写入操作,恢复提交事务修改的页操作。
,用来保证事务的持久性。
undo log(回滚日志):回滚行记录到某个特定的版本,用来保证事务的原子性,一致性。
redo的流程:保证事务的持久性
第一步:先将原始数据从磁盘读取到内存中,修改数据的内存拷贝
第二步:生成一条重做日志并写入redo log buffer ,记录的是数据被修改后的值
第三步:当事务commit时,将redo log buffer 中的内容刷新到redo log file采用追加写的方式。
第四步:定期将内存中修改的数据刷新到磁盘中

undo日志:保证事务原子性和一致性。在事务中 更新数据的前置操作,其实时要先写入一个undo log

两种日志分别保证了,事务的持久性,与原子性,一致性,那个事务的隔离性又通过什么方式实现的呢
首先,事务的隔离性,就是为了不同的事务之间不存在干扰,就需要对事务的操作进行隔离,也就是说事务的隔离性就是将操作同一个数据的事务互相分离,让操作之间分开有序的执行。
Mysql数据库为保证隔离性,所以对时间采用加锁的机制。下面我们对锁的类型研究分析
6.MySQL中的锁
| 分类 | 锁 |
| 基于锁的属性 | 共享锁(s,读锁),排他锁(X,写锁) |
| 基于锁的粒度 | 表锁,行锁(记录锁,间隙锁,临键锁) |
| 基于锁得状态 | 意向共享锁,意向排他锁 |
在MySQL中,特别是针对InnoDB存储引擎,存在多种类型的锁,用于控制事务之间的并发访问,确保数据的一致性和隔离性。以下是一些常见的锁类型:
1.共享性(s):也称读锁。当一个事务对某个数据项加了共享锁,其他事务可以同时对该数据项加共享锁,但不能加排他锁(写锁)。共享锁主要用于支持读取操作。
2.排他锁(X):也称为写锁。当一个事务对某个数据项加了排他锁,其他事务不能对该数据项加任何类型的锁。排他锁主要用于支持写入操作,如更新,插入,删除数据。
3.意向共享锁(IS):事务想要获取一个表上的多个行的共享锁时,可以在表级别加意向共享锁,这样可以减少锁的粒度,提高并发性能。
4.意向排他锁(IX):事务想要获取一个表上的多个行的排他锁时,可以在表级别加意向排他锁。这种锁表明事务可能需要对这些行加排他锁。
5.表锁:这种锁是在表级别上加的,通常用于MYISAM存储引擎,表锁包括表共享读锁,和表排他写锁,它们分别对应共享锁和排他锁。
6.行级锁:这种锁是在行级别上加的,主要用于InnoDB存储引擎。行级锁包括记录锁,间隙锁和临键锁。这些锁主要用于实现MVCC(多版本并发控制)和避免幻读现象。
7.乐观锁:这种锁机制假设并发冲突较少,事务在提交时才检查是否有冲突。通常通过版本号或时间戳来实现。
8.悲观锁:这种锁机制假设并发冲突较多,事务在开始时就枷锁,以防止其他事务的修改。这种方式可能导致锁等待和性能下降。
在实际应用中,MySQL会根据事务的需要和配置参数自动选择合适的锁类型,以平衡并发性能和数据一致性。
7.行锁中,间隙锁,临键锁的介绍
间隙锁:是InnoDB存储引擎用来解决幻读问题的一种锁机制,间隙锁锁定的是索引记录之间的间隙,或者是第一个索引记录之前或最后一个索引巨鹿之后的空间,而不是索引记录本身。
间隙锁的作用:阻止其他事务在锁定的间隙内插入新的索引记录。这样当一个事务在执行范围查询时,即使其他事务尝试插入新的记录到这个范围内,也不会影响当前事务的查询结果,从而避免幻读。
间隙锁的工作原理:
1.锁定间隙:当一个事务执行一个带范围条件的查询语句,或者执行一个带范围条件的修改,或删除语句,InnoDB会锁定满足条件的索引巨鹿之间的间隙
2.共享和排他锁间隙锁:间隙锁可以是共享的或排他的,共享间隙锁不会阻止其他事务获得共享间隙锁,但会组织排他间隙锁。排它间隙锁则会组织其他事务获得任何类型的间隙锁。
3.间隙锁或索引:间隙锁只在事务隔离级别为 可重复读或序列化时使用。而且。间隙锁只在与某些类型的索引一起使用时才会生效。例如聚簇索引或辅助索引。
临键锁:在MySQL中,临键锁是InnoDB存储引擎用来解决幻读问题的一种锁机制。临键锁是记录锁和间隙锁的组合,它不仅能锁定记录本身,还能锁定记录下一个值得间隙,从而防止其他事务在该间隙内插入新的记录。
临键锁的作用:
1.防止幻读:通过锁定记录下一个值的间隙,林间锁可以防止其他事务在该间隙内插入新的记录,从而避免了幻读现象。
2.提高并发性能:临键锁的使用可以减少锁的竞争,提高系统的并发性能。
临键锁的工作原理:
临键锁是在记录锁的基础上扩展而来的。当一个事务执行一个带有范围条件的select查询语句,或者执行一个带范围条件的update和delete语句时,InnoDB不仅会锁定满足条件的索引记录,还会锁定这些记录下一个值得间隙。
临键锁和间隙锁的注意事项:
1.性能影响:间隙锁可能会增加锁竞争,从而影响性能。因此设计数据库时应该考虑索引的选择或事务隔离级别的设置。
2.死锁风险:由于间隙锁的存在,事务之间可能会发生死锁。例如,两个事务可能都试图锁定同一个间隙,导致互相等待。
3.锁的释放:间隙锁旨在事务提交或回滚时释放,而不是在语句执行完毕时释放。
通过使用间隙锁,MySQL的InnoDB存储引擎能够提供更高的事务隔离级别,同时尽可能地减少锁竞争,提高并发性能。然而,间隙锁的使用也需要谨慎,因为其可能引入死锁的风险,并对性能产生一定的影响。
8.事务的隔离级别:
在事务并发执行时,如果不进行事务隔离,那么就会产生脏写,脏读,重复读,幻读的问题。所以MySQL为我们提供了不同的事务隔离级别。每个隔离级别都针对事务并发问题中的一种或几种继续宁解决,事务级别越高,解决的并发事务问题也就越多,同时意味着加的锁就越多,所以性能也会越差。
1.read_uncommited 读未提交 :含义读取到未提交的数据,但是数据未提交,如果回滚,就会出现脏读
2.read_comminted 读提交(不可重复读):读取到已提交的数据,(但是不能保证在数据变化之前你提交之前读过一次,两次数据有差异,会出现幻读,所以也叫不可重复读。)。
3.repeatable_read 可重复读:可以重复读取数据,但是只有在两个事务都结束后,才能读取到正确数据,会出现幻读
4.serializable 串行化 :这是为了解决幻读问题,第一个事务执行时,不允许第二个事务操作,只有前一个完成操作,后面下一个才会操作,保证数据了一致性。但是执行效率很低。
9.事务并发出现的问题:
对于SessionA 和SessionB
1.脏写:就是A 修改 了B 未提交 但修改过的数据,
2.脏读:A 读取了 B 更新但还没提交的数据 若B回滚 A读取数据无效不存在,
3.不可重复读:A读取了一份数据后,B修改了数据,A再读,数据变了,这就叫不可重复读
4.幻读:指在一个事务中多次执行相同的查询,但第二次返回的结果集比第一次多出了一些不存在的数据,
避免幻读的方法:
1.使用事务隔离级别:重复读,串行化
2.使用锁:行级锁,间隙锁
3.使用悲观锁,乐观锁
4.使用事务的保存点和回滚
5.使用数据库约束
6.查询优化
10.MySQL的MVCC
MySQL的多版本并发控制是一种用于实现事务隔离的技术,它允许多个事务在同一时刻对同一数据进行操作而不互相阻塞。MVCC通过维护数据的多个版本来实现这一点,每个事务看到的版本是基于该事务开始时的数据版本。
基本原理:
1.版本号:每个数据行都有一个隐藏的版本号,用于表示该行数据的版本。当一行数据倍修改时,其版本号也会被更新。
2.读取操作:读取操作会读取符合其事务开始时版本号的数据版本。而不是最新的版本。这样可以保证事务在读取过程中看到的数据一致
3.写入操作:写入操作会创建一个新的数据版本,并更新改行数据的版本号,旧的数据版本仍然保留,知道垃圾回收器清理。
MySQL中MVCC的实现:
mysql的InnoDB存储引擎使用了一种“乐观锁定”的技术来实现MVCC,包含以下机制:
1.行班本链:每行数据都有一个版本链,包含该行数据的所有版本,每个版本都有关联的时间戳,表示该版本的创建时间。
2.事务快照:每个事务在开始时会创建一个快照,记录当前所有的活动事务。事务在读取数据时,会使用这个快照来确定哪些数据版本是可见的。
3.间隙锁:为了防止幻读,InnoDB使用了间隙锁,它可以锁定结果集之间的间隙,防止其他事务插入新的记录
优点:
1.提高并发性能:MVCC减少锁的使用,提高系统的并发性能
2.减少锁争用:由于每个事务看到的是自己快照中的数据版本,减少了锁争用情况
3.简化事务管理:MVCC使得事务的管理和隔离更加简单和高效
缺点:
1.额外的存储开销:维护多个数据版本会占用更多的存储空间
2.垃圾回收开销:需要定期清理不再需要的数据版本,否则回导致存储空间浪费
相关文章:
MySQL事务,锁,MVCC总结
mysql中最重要的就是事务,其四大特性让我们维持了数据的平衡,一致。那么事务究竟是什么,与什么相关,他的使用步骤,以及使用过程中我们会遇到什么问题呢?下面我们一起学习交流! 1.MySQL的存储引擎ÿ…...
24/8/7 算法笔记 支持向量机回归问题天猫双十一
import numpy as np from sklearn.svm import SVR import matplotlib.pyplot as plt X np.linspace(0,2*np.pi,50).reshape(-1,1) y np.sin(X) plt.scatter(X,y) 建模 线性核函数 svr SVR(kernel linear) svr.fit(X,y.ravel())#变成一维y_ svr.predict(X) plt.scatter(…...
win7系统利用定时启动+脚本实现MySQL文件自动备份
前言 最近接到项目,数据量不大但对运行数据的安全性要求极高,为避免因不可抗拒因素导致的数据丢失,选择机械硬盘作为数据存储盘,并使用脚本方式对文件进行备份 一、脚本 下面为自动备份文件的 脚本,可根据自身情况进…...
基于Java多线程处理数据
基于Java多线程处理数据 背景代码实现 背景 在日常工作中,有一个同步企微客户-学员关系接口的定时任务在执行中随着数据量的不断增长,定时任务的执行结束时间也出现了当天执行不完的情况,影响到了正常业务的运行。基于这种情况,在…...
日常知识点之遇到问题结构体按位构造协议时和期望不一致,研究记录一下
遇到一个问题,在做业务的时候,涉及到协议相关,按位进行设计,用结构体来模拟协议时,发现内存存储和实际目的不一致,知道是大小端以及计算机底层存储逻辑相关,所以研究了一下。 1:简单…...
spring mvc 文件下载
在web中下载的方式大多基于servlet,在web.xml中配置下载路径,这里再介绍json(转成base64字符串)和blob的使用方式 servlet WEB-INF/web.xml <!--url映射--> <servlet-mapping><servlet-name>DowloadServlet</servlet-name>&l…...
Qt WebEngine基于WebEngineScript注入js脚本
在之前的文章中,我们介绍了Qt WebEngine注入js的用法,及runJavaScript()的用法,该方法主要是用在页面加载完成后,为了和网页做一些交互时使用。有时候需要监听网页加载完成的一些状态或信息,则需要网页加载前注入js来实…...
案例分享-国外UI设计界面赏析
国外UI设计倾向于简洁的布局和清晰的排版,减少视觉干扰,提升用户体验。通过合理的色彩搭配和图标设计,营造舒适愉悦的使用氛围。 设计师不拘泥于传统框架,勇于尝试新元素和理念,使界面独特有趣。同时,强调以…...
用PyTorch 从零开始构建 BitNet 1.58bit
我们手动实现BitNet的编写,并进行的一系列小实验证实,看看1.58bit 模型是否与全精度的大型语言模型相媲美! 什么是量化以及为什么需要它? 量化是用更少的比特数表示浮点数的过程。当两个数字使用不同的比特数进行量化时…...
信创安全 | 新一代内网安全方案—零信任沙盒
在当今数字化时代,访问安全和数据安全成为企业面临的重要挑战。传统的边界防御已经无法满足日益复杂的内网办公环境,层出不穷的攻击手段已经让市场单一的防御手段黔驴技穷。当企业面临越来越复杂的网络威胁和数据泄密风险时,更需要一种综合的…...
Redis的回收策略(淘汰策略)
volatile-lru :从已设置过期时间的数据集( server.db[i].expires )中挑选最近最少使用的数据淘汰 volatile-ttl : 从已设置过期时间的数据集( server.db[i].expires ) 中挑选将要过期的数据淘汰 volatile…...
Electron-builder 打包
项目比较简单,仅使用了 Electron 原生js 安装 electron-builder npm install electron-builder --dev配置 package.json 中的打包命令 {"script":{// ..."dev": "electron .","pack": "electron-builder"} }添…...
笔试练习day3
目录 BC149 简写单词题目解析代码 dd爱框框题目解析解析代码方法一暴力解法方法二同向双指针(滑动窗口) 除2!题目解析解法模拟贪心堆 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸…...
企业想要将大模型技术应用到企业管理中需具备什么条件?
#企业 #企业管理 #大模型 企业想要将大模型技术应用到企业管理中,需要考虑以下几个关键条件: 1.明确的需求定位:企业应首先诊断自身的业务场景、数据、算法、基础设施预算以及战略等能力,明确大模型能够为企业带来的具体赋…...
go 事件机制(观察者设计模式)
背景: 公司目前有个业务,收到数据后,要分发给所有的客户端或者是业务模块,类似消息通知这样的需求,自然而然就想到了事件,观察者比较简单就自己实现以下,确保最小功能使用支持即可,其…...
RISC-V竞赛|第二届 RISC-V 软件移植及优化锦标赛报名正式开始!
目录 赛事背景 赛道方向 适配夺旗赛 优化竞速赛 比赛赛题(总奖金池8万元!) 🔥竞速赛 - OceanBase 移植与优化 比赛赛程(暂定) 赛事说明 「赛事背景」 为了推动 RISC-V 软件生态更快地发展࿰…...
【VTK】ubuntu手动编译VTK9.3 Generating qmltypes file 失败
环境 硬件:Jetson Xavier NX 套件 系统:Ubuntu 20.04 软件 :QT5.15.6 解决 0、问题 最近在Jetson Xavier NX 套件上编译VTK库,因为想要配合QQuick使用,所以cmake配置时勾选了VTK_MODULE_ENABLE_VTK_GUISupportQtQu…...
学习java的日子 Day64 学生管理系统 web2.0 web版本
MVC设计模式 概念 - 代码的分层 MVC:项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程(跳转) 1.细化理解层数 Controller:控制器层,用于存放Servlet&…...
【第14章】Spring Cloud之Gateway路由断言(IP黑名单)
文章目录 前言一、内置路由断言1. 案例(Weight)2. 更多断言 二、自定义路由断言1. 黑名单断言2. 全局异常处理3. 应用配置4. 单元测试 总结 前言 Spring Cloud Gateway可以让我们根据请求内容精确匹配到对应路由服务,官方已经内置了很多路由断言,我们也…...
3、pnpm yarn npm
项目里实际上就只有这些依赖 node module 里却有很多的包 原因: 比如说vue,vue内部有依赖了其余的包。工具又依赖了别的依赖 造成的问题:我可以直接去用这个包,但是这个包在package.json中却没有看到-----幽灵依赖 那如果说别…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
