当前位置: 首页 > news >正文

Mysql各种锁

一.不同存储引擎支持的锁机制

Mysql数据库有多种数据存储引擎,Mysql中不同的存储引擎支持不同的锁机制

MyISAM和MEMORY存储引擎采用的表级锁

InnoDB存储引擎支持行级锁,也支持表级锁,默认情况下采用行级锁

二.锁类型的划分

按照数据操作的类型分:

读锁(共享锁):针对同一份数据,多个事务可以同时读取

写锁(排他锁):执行写操作未释放锁之前,其他事务不能读取数据或者修改数据

按照数据操作的粒度分:

表级锁:开销小,加锁快,不会出现死锁,锁地粒度较大,发生冲突的概率也越大,并发性能低

行级锁:开销大,加锁慢,会出现死锁,锁定粒度较小,发生冲突的概率小,并发性能越高

行级锁分为共享锁和排它锁两种锁

行锁是Mysql锁中粒度最小的一种锁,虽然锁的粒度小,发生资源争抢的概率也小,但是也会出现死锁的情况

按照操作性能可分为乐观锁和悲观锁

乐观锁:一般的实现方式是对记录数据的版本进行对比,在提交更新的时候进行冲突检测,如果发现错误信息,则提示错误信息

悲观锁:在对一条数据修改前,先加锁,避免同时被其他人修改

三.使用Mysql行级锁的两个前提:

(1)使用innoDB引擎

(2)开启事务(隔离级别为可重复读)

这样确保在同一事务中读取的数据一致,并且在事务结束之前锁定所需的行。

START TRANSACTION;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 执行对数据的操作,包括锁定行级别的操作-- 提交事务或回滚事务
COMMIT;
-- 或
ROLLBACK;

四.InonoDB行锁的类型:

(1)共享锁:当事务对数据加上共享锁后,其他用户可以读取数据,但是不能修改数据,直到释放锁

(2)排他锁:如果事务A对数据B加上锁之后,在事务A没有释放锁之前,其他事务不能修改数据B和读取数据B。

InnoDB如何实现行锁

在做增删改查的时候加读锁,修改表结构的时候加写锁。

加锁的方式:

1.InnoDB引擎默认更新语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型

2.加共享锁:select*from table where ...lock in share mode

 加排他锁:select *from table where...fro update

五.事务的隔离级别和锁的关系

(1)事务的隔离级别是SQL92定制的标准,相当于事务并发控制的整体解决方案,而本质上是对锁和MVCC使用的封装

(2)事务隔离性使用锁来实现的,对响应的操作加不同的锁,可以防止其他事务同时对数据进行读写操作。

(3)当使用隔离级别不能解决并发问题的时候,我们可以用锁

六.行级锁产生死锁的原因:

(1)在一条事务中执行了一条没有索引条件的查询,引发全表扫描,把行级锁上升为全表记录锁定(等价于表级锁),多个这样的事务执行后,就很容易出现死锁和阻塞

如何解决:SQL语句不要有太多的复杂的关联多表查询,使用explain“执行计划”对SQL语句进行分析,对于全表扫描的语句,建立索引

(2)两个事务分别向拿到对方的锁,互相等待,产生了死锁

 (3)同一个事务中只有一个SQL,但是有些情况还是会出现锁的情况

     (1)事务1从name索引出发,读取到的[hdc,1],[hdc,6]均满足条件,加锁先[1,hdc,100],后[6,hdc,10]

      (2)事务2从pubtime索引出发,读取到的[hdc,1],[hdc,6]均满足条件,加锁先[1,hdc,100],后[6,hdc,10]

      (3)因为加锁时事务1和事务1加锁顺序正好相反,所以导致了死锁

七.MVCC

MVCC:多版本并发控制,用于实现读已提交和可重复读隔离级别

MVCC:核心是多版本链+Read view。"MV"就是通过Undo log来保存数据的历史版本,实现多版本的管理,"CC"是通过Read-view来实现管理,通过read-view原则决定数据是否显示,同时针对 不同的隔离级别,read-view的生成策略也不同,也就实现了不同的隔离级别

每个数据行当中还会有两个字段,一个是trx_id表示修改当前数据的id,另一个是roll_pointer,指向上一次修改的数据行

当前读:读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁,比如select..lock in share mode(共享锁),select ..for update、update、insert、delete(排他锁)都是当前读

快照读:快照读读取的是记录数据的可见版本,有可能是历史数据,不加锁,是非阻塞读

(1)Read Committed:每次select,都生成一个快照读

(2)Repeatable  read:开启事务第一个select语句才是快照读的地方

undolog回滚日志:

(1)回滚日志:存储老版本数据

(2)版本链:记录不同事务提交事务修改数据的版本,通过roll_pointer指针形成一个链表

当一个事务第一次执行查询sql时,会生成一致性视图read-view(快照),查询时从undo log中最新的一条记录开始跟read-view作对比,如果不符合比较规则,就根据回滚指针回滚到上一条记录继续比较,直到得到符合比较条件的查询结果。

ReadView判断某个记录版本是否可见的规则如下

当执行一次sql时会生成一致性视图read-view,它由执行查询所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务(max_id)组成,查询的数据结果需要跟read-view做对比而得到快照结果

版本链对比规则:

1.如果落在绿色部分(trx_id<min_id),表示这个版本是已提交的事务生成的,这个数据是可见的

2.如果落在红色部分(trx_id>max_id)表示这个版本是由将来的事务生成的,是不可见的

3.如果落在(min_id<=trx_id<=max_id)黄色部分包括两种情况

如果当前事务的id在未提交事务的数组中,此条记录不可读

如果当前事务的id在已提交事务的数组中,则此条记录可读

举个例子:

假设当前为可重复读

如图,当我们进行第一次查询的时候

事务100,事务200都没有提交,事务300都没有提交,此时生成的一致性视图为:

[100,200]300

此时的数据版本链为:


我们从最上边这条数据(lilei300)开始对比,这条数据trx_id  为300,落在了黄色区域,且不在

未提交事务的id[100,200]中,那么这个数据版本是可见的,所以最终读到的数据就是name为lilei300这条数据

接下来我们再来进行第二次查询

因为是可重复读此时我们的一致性视图还是[100,200]300,此时因为事务100对数据做了两次修改,此时的数据版本链为

 此时生成的一致性视图是:[200]300,此时的数据版本

我们再从上往下一次将数据和视图作比较,lilei2和liei1这两条数据trix_id都为100,此时落在了黄色区域,但是在未提交事务的数组中,属于不可读,接下来又读取lilei300这条数据,显然这条数据是可见的。

我们再开启一个新的事务读取数据:

此时的一致性视图为:[200]300,

此时的数据版本链为: 

然后再进行对比,我们发现 lilei4和lilei3这两条数据trx_id都是200,在黄色区域,但是在数组[200】里,此数据版本不可见,单但ile2这条数据trx_id为100,在绿色区域,此数据版本可见,读取的就是lilei2这条数据。如果在这个事务里再次读取,用的还是一致性视图为:[200]300,最终读取到的数据是一样的。

综上我们可以发现,在可重复读的隔离级别下,同一个事务里生成的一致性视图都是这个事务第一次执行快照读生成的视图,因此同一个事务里多次读取数据,得到的结果是一致的。

在不可重复读的隔离级别下,每一次执行快照读都会生成readview

相关文章:

Mysql各种锁

一.不同存储引擎支持的锁机制 Mysql数据库有多种数据存储引擎&#xff0c;Mysql中不同的存储引擎支持不同的锁机制 MyISAM和MEMORY存储引擎采用的表级锁 InnoDB存储引擎支持行级锁&#xff0c;也支持表级锁&#xff0c;默认情况下采用行级锁 二.锁类型的划分 按照数据操作…...

【算法导论】快速排序

文章目录 1. 快速排序的描述 1.1基本描述1.2 PARTITOION函数1.3 快速排序C完整代码 2. 快速排序的性能2.1 最坏时间复杂度2.2 平均时间复杂度 1. 快速排序的描述 1.1基本描述 快速排序是一种时间复杂度为 O(n^2) 的排序算法。虽然最坏情况时间复杂度很差&#xff0c;但他的平…...

QT之QScriptEngine的用法介绍

QT之QScriptEngine的用法介绍 成员函数用法举例 成员函数 1&#xff09;QScriptEngine::evaluate(const QString &program, const QString &fileName QString(), int lineNumber 1) 执行 JavaScript 代码并返回结果。 2&#xff09;QScriptEngine::evaluate(const…...

vim 工具的使用

注&#xff1a;以下操作都在普通模式下进行 光标的移动操作 gg 定位到代码的第一行 shiftg 定位到代码的最后一行 nshiftg 定位到第n行 shift6: 特定一行的开始 shift4 特定一行的结尾 上下左右的移动光标 h: 向左移动光标 j: 向下移动光标 k: 向上移动光标 l: 向右移动光标 …...

RPA有什么优势?RPA的8大优势!建议学习!

随着科技的不断发展&#xff0c;越来越多的企业开始寻求数字化转型&#xff0c;以提高生产力和效率。在这个过程中&#xff0c;RPA&#xff08;Robotic Process Automation&#xff09;机器人流程自动化技术逐渐成为企业数字化转型的重要工具之一。本文将从八个方面阐述RPA的优…...

初级篇—第二章SELECT查询语句

文章目录 什么是SQLSQL 分类SQL语言的规则与规范阿里巴巴MySQL命名规范数据导入指令 显示表结构 DESC基本的SELECT语句SELECTSELECT ... FROM列的别名 AS去除重复行 DISTINCT空值参与运算着重号查询常数过滤数据 WHERE练习 运算符算术运算符加减符号乘除符号取模符号 符号比较运…...

PostMan的学习

PostMan的学习 目录 环境变量和全局变量接口关联内置动态参数以及自定义动态参数实现业务闭环Postman断言批量运行collection数据驱动之CSV文件和JSON文件测试必须带请求头的接口Mock Serviers 服务器Cookie鉴权NewmanPostManNewManjenkins实现接口测试持续集成 参考资料&am…...

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;路由协议是另一个比较常用的路由协议之一&#xff0c;它通过路由器之间通告网络接口的状态&#xff0c;使用最短路径算法建立路由表。在生成路由表时&#xff0c;…...

CCF CSP认证 历年题目自练Day17

CCF CSP认证 历年题目自练Day17 题目一 试题编号&#xff1a; 201803-1 试题名称&#xff1a; 跳一跳 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   近来&#xff0c;跳一跳这款小游戏风靡全国&#xff0c;受到不少玩家的喜爱…...

基于Matlab实现多因子选股模型(附上源码+数据)

本文将介绍如何使用MATLAB实现多因子选股模型。我们将使用市盈率和市净率两个因子来进行选股&#xff0c;并通过简单的代码案例来演示该过程。 文章目录 引言简单案例总结源码数据下载 引言 多因子选股模型是一种常用的股票选股方法&#xff0c;通过综合考虑多个因子的信息来…...

【中秋国庆不断更】OpenHarmony多态样式stateStyles使用场景

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以根…...

Qt扩展-QCustomPlot绘图基础概述

QCustomPlot绘图基础概述 一、概述二、改变外观1. Graph 类型2. Axis 坐标轴3. 网格 三、案例1. 简单布局两个图2. 绘图与多个轴和更先进的样式3. 绘制日期和时间数据 四、其他Graph&#xff1a;曲线&#xff0c;条形图&#xff0c;统计框图&#xff0c;… 一、概述 本教程使用…...

二、局域网联机

目录 1.下载资源包 2.配置NetworkManager 3.编写测试UI 1.下载资源包 2.配置NetworkManager &#xff08;1&#xff09;在Assets/Prefabs下创建Network Prefabs List 相应设置如下&#xff1a; &#xff08;2&#xff09; 创建空物体“NetworkManager”并挂载NetworkMan…...

决策树剪枝:解决模型过拟合【决策树、机器学习】

如何通过剪枝解决决策树的过拟合问题 决策树是一种强大的机器学习算法&#xff0c;用于解决分类和回归问题。决策树模型通过树状结构的决策规则来进行预测&#xff0c;但在构建决策树时&#xff0c;常常会出现过拟合的问题&#xff0c;即模型在训练数据上表现出色&#xff0c;…...

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者&#xff0c;不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码&#xff0c;所以对环境和依赖很熟悉&#xff0c;对整个系统也是学习了几个月&#xff0c;一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…...

二十,镜面IBL--打印BRDF积分贴图

比起以往&#xff0c;这节应该是最轻松的了&#xff0c; 运行结果如下 代码如下&#xff1a; #include <osg/TextureCubeMap> #include <osg/TexGen> #include <osg/TexEnvCombine> #include <osgUtil/ReflectionMapGenerator> #include <osgDB/Re…...

自动驾驶:未来的道路上的挑战与机遇

自动驾驶&#xff1a;未来的道路上的挑战与机遇 文章目录 引言安全与道路事故的减少交通拥堵的缓解城市规划的变革技术和法律挑战结语 2023星火培训【专项营】Apollo开发者社区布道师倾力打造&#xff0c;包含PnC、新感知等的全新专项课程上线了。理论与实践相结合&#xff0c;…...

Go 语言 iota 的神奇力量

前言 当你深入研究官网库、开源库或者任何一个 Go 项目时&#xff0c;你都会发现 iota 这个神奇的标识符无处不在。它扮演着一种重要的角色&#xff0c;让代码变得更加简洁、清晰&#xff0c;并提高了可读性和可维护性。它的应用范围广泛&#xff0c;从枚举类型到位运算&#…...

前端开发和后端开发的一些建议

前端开发和后端开发是Web开发的两个方向 前端开发主要负责实现用户在浏览器上看到的界面和交互体验&#xff0c;包括HTML、CSS和JavaScript等技术。后端开发主要负责处理服务器端的逻辑和数据&#xff0c;包括数据库操作、服务器配置和接口开发等技术。 前端开发 前端开发需…...

基于 SpringBoot+Vue 的教室人事档案管理系统

1 简介 教师人事档案管理系统利用信息的合理管理&#xff0c;动态的、高效的、安全的实现了教师的各种需求&#xff0c;改变了传统的网上查看方式&#xff0c;使教师可以足不出户的在线查看最适合自己个人档案、奖惩信息、档案变动、培训报名或者新闻资讯。 1、教师后台功能模…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

windows系统MySQL安装文档

概览&#xff1a;本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容&#xff0c;为学习者提供全面的操作指导。关键要点包括&#xff1a; 解压 &#xff1a;下载完成后解压压缩包&#xff0c;得到MySQL 8.…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...