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

Lua学习笔记:require非.lua拓展名的文件

前言 本篇在讲什么 Lua的require相关的内容 本篇需要什么 对Lua语法有简单认知 对C语法有简单认知 依赖Visual Studio工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠…...

Python 编程基础 | 第三章-数据类型 | 3.3、浮点数

一、浮点数...

beego---ORM相关操作

Beego框架是go语言开发的web框架。 **那什么是框架呢&#xff1f;**就是别人写好的代码&#xff0c;我们可以直接使用&#xff01;这个代码是专门针对某一个开发方向定制的&#xff0c;例如&#xff1a;我们要做一个网站&#xff0c;利用 beego 框架就能非常快的完成网站的开发…...

【网络原理】初始网络,了解概念

文章目录 1. 网络通信1.1 局域网LAN1.2 广域网WAN 2. 基础概念2.1 IP2.2 端口号 3. 认识协议4. 五元组5. 协议分层5.1 分层的作用5.2 OSI七层模型5.3 TCP/IP五层&#xff08;四层&#xff09;模型 6. 封装和分用 1. 网络通信 计算机与计算机之间是互相独立&#xff0c;是独立模…...

对象存储,从单机到分布式的演进

关于数据存储的相关知识,请大家关注“数据存储张”,各大平台同名。 通过《什么是云存储?从对象存储说起》我们对对象存储的历史、概念和基本使用有了一个大概的认识。而且我们以Minio为例,通过单机部署的模式实际操作了一下对象存储的GUI,感受了一下对象存储的用法。 在上…...

结构型设计模式——桥接模式

摘要 桥接模式(Bridge pattern): 使用桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。 一、桥接模式的意图 将抽象与实现分离开来&#xff0c;使它们可以独立变化。 二、桥接模式的类图 Abstraction: 定义抽象类的接口Implementor: 定义实现类接口 …...

keepalived的vip实现nginx节点的主备

nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz tar zxvf nginx-1.18.0.tar.gzyum install -y gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel libnl3-develcd nginx-1.18.0 mkdir -p /usr/local/nginx #需要使用https&#xff0c;在编译时启用…...

C++之std::atomic解决多线程7个问题(二百四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

tailwindcss 如何在 uniapp 中使用

直接使用https://tailwindcss.com/docs/guides/vite这篇官方教程的写法是跑不通的&#xff0c;摸索以后整理了一下&#xff0c;最关键的是第6步 npm install -D tailwindcss postcss autoprefixernpx tailwindcss init -p在 tailwind.config.js 中写入 export default {conten…...

oracle-使用PLSQL工具自行修改用户密码

1、使用PLSQL工具&#xff0c;输入用户名和原密码登录&#xff0c;如下图 2、登录后&#xff0c;在会话下拉菜单中找到”Change password..” 3、在跳出的窗口中配置新密码&#xff0c;修改完成后单击”确认”&#xff0c;后退出PLSQL 4、重新打开PLSQL&#xff0c;使用新密码登…...

重庆建工网/seo学校培训班

最近360、金山、可牛、遨游可谓打得一团火&#xff0c;毕竟在这么大竞争市场里面&#xff0c;分一块蛋糕可不是一件容易的事情&#xff0c;当中涉及到利益关系复杂&#xff0c;矛盾不断升级&#xff0c;同行里面究竟谁破坏了规矩&#xff0c;我们简单做一个陈述。 首先我们出场…...

南京设计公司前十名/深圳优化怎么做搜索

大家好&#xff0c;9月14日&#xff08;周五&#xff09;【免费送书】说说哪本书曾经让你爱不释手活动中获奖名单如下&#xff0c;排名1—10的留言读者免费赠送图书一本&#xff0c;图书从活动里的书单中任选&#xff0c;由电子工业出版社博文视点提供&#xff1b;排名11—20的…...

浙江高端网站建设/seo优化的主要任务包括

【CVPR 2021】基于Wasserstein Distance对比表示蒸馏方法&#xff1a;Wasserstein Contrastive Representation Distillation论文地址&#xff1a;主要问题&#xff1a;主要思路&#xff1a;Wasserstein Distance&#xff1a;基本内容&#xff1a;定义&#xff1a;具体实现&…...

做翻译 网站/百度网站网址是多少

KD302 成本中心 CTR xxx/xxxx, 成本要素 4210000: 不能划分 (2013-03-05 11:11:17) 转载▼ 标签&#xff1a; it 分类&#xff1a; SAP 都什么年代了&#xff0c;版本都ehp6了还有这个BUG啊。。。 成本中心 CTR xxx/xxxx, 成本要素 4210000: 不能划分 消息号 KD302 诊断 …...

wordpress中文是什么意思/建立网站的步骤

ALTFP_CONVERT IP使用与仿真 近期项目要使用到整型数据转浮点型数据&#xff0c;将16位的整数转换为单精度浮点数&#xff08;32bit&#xff09;。本打算自己写逻辑实现的&#xff0c;不过考虑到本身项目时间紧&#xff0c;能力也有限&#xff0c;就没有贸然行事。再说了&…...

网站托管解决方案/seo搜索如何优化

请创建一个一维整型数组用来存储待排序关键码&#xff0c;关键码从数组下标为1的位置开始存储&#xff0c;下标为0的位置不存储关键码。输入关键码的个数&#xff0c;以及各个关键码&#xff0c;采用希尔排序的方法对关键码数组进行排序&#xff0c;输出每轮比较的过程。 输入描…...