当前位置: 首页 > 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、教师后台功能模…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...