【mysql】-【锁】

news2024/9/20 16:29:08

文章目录

  • 概述
  • MySQL并发事务访问相同记录
    • 读-读情况
    • 写-写情况
    • 读-写或写-读情况
    • 并发问题的解决方案
  • 锁的不同角度分类

概述

事务的隔离性由这章讲述的锁来实现。
请添加图片描述

MySQL并发事务访问相同记录

并发事务访问相同记录的情况大致可以划分为3种:

读-读情况

读-读情况,即并发事务相继 读取相同的记录 。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。

写-写情况

写-写情况,即并发事务相继对相同的记录做出改动。在这种情况下会发生脏写的问题(事务一、事务二各自开启一个事务,查询某条记录,结果为1,然后事务一将结果改为2,事务二将结果改为3,然后事务一commit,事务二rollback了,此时数据库的结果为1,这就是脏读),任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务 相继对一条记录做改动时,需要让它们 排队执行 ,这个排队的过程其实是通过 锁 来实现的。这个所谓 的锁其实是一个 内存中的结构 ,在事务执行前本来是没有锁的,也就是说一开始是没有 锁结构 和记录进 行关联的,如图所示:
请添加图片描述
当一个事务想对这条记录做改动时,首先会看看内存中有没有与这条记录关联的 锁结构 ,当没有的时候 就会在内存中生成一个 锁结构 与之关联。比如,事务 T1 要对这条记录做改动,就需要生成一个 锁结构 与之关联:
请添加图片描述
锁结构与事务相关,有几个事务来操作数据,就有几个锁结构
请添加图片描述
请添加图片描述
请添加图片描述
小结几种说法:

  1. 不加锁:意思就是不需要在内存中生成对应的 锁结构 ,可以直接执行操作。
  2. 获取锁成功,或者加锁成功:意思就是在内存中生成了对应的 锁结构 ,而且锁结构的 is_waiting 属性为 false ,也就是事务 可以继续执行操作。
  3. 获取锁失败,或者加锁失败,或者没有获取到锁:意思就是在内存中生成了对应的 ,不过锁结构的 属性为 true ,也就是事务 需要等待,不可以继续执行操作。

读-写或写-读情况

读-写 或 写-读 ,即一个事务进行读取操作,另一个进行改动操作。这种情况下可能发生 脏读 、 不可重复读 、 幻读 的问题。各个数据库厂商对 SQL标准 的支持都可能不一样。比如MySQL在 REPEATABLE READ 隔离级别上就已经解决了 幻读 问题。

并发问题的解决方案

怎么解决脏读、不可重复读、幻读这些问题呢?其实有两种可选的解决方案:

  1. 方案一:读操作利用多版本并发控制(MVCC ,下章讲解),写操作进行加锁。
    请添加图片描述

普通的SELECT语句在READ COMMITTED和REPEATABLE READ隔离级别下会使用到MVCC读取记录。

  1. 在 READ COMMITTED 隔离级别下,一个事务在执行过程中每次执行SELECT操作时都会生成一 个ReadView,ReadView的存在本身就保证了 事务不可以读取到未提交的事务所做的更改 ,也就 是避免了脏读现象;
  2. 在 REPEATABLE READ 隔离级别下,一个事务在执行过程中只有 第一次执行SELECT操作 才会 生成一个ReadView,之后的SELECT操作都 复用 这个ReadView,这样也就避免了不可重复读 和幻读的问题。
  1. 方案二:读、写操作都采用 加锁 的方式。
    请添加图片描述

小结对比发现:

  1. 采用MVCC方式的话,读-写操作彼此并不冲突,性能更高
  2. 采用加锁方式的话, 读-写操作彼此需要排队执行,影响性能。

一般情况下我们当然愿意采用MVCC来解决读-写操作并发执行的问题,但是业务在某些特殊情况 下,要求必须采用加锁的方式执行。下面就讲解下MySQL中不同类别的锁。

锁的不同角度分类

锁的分类图,如下:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/736668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用vite创建vue3的Cesium基础项目

使用vite创建vue3的Cesium基础项目 使用vite创建vue3项目:可以参考官方文档Vite官方中文文档 1.1 在指定文件夹路径下使用npm(前提是已经安装好了node): bash npm create vitelatest 1.2 cd到创建的项目文件夹: bash c…

符号化的正确姿势

GUI方式 将 .ips crash report 文件拖放到 Xcode > Window > Devices and Simulators > View Device Logs中, 然后导出 .crash 符号化文件. 使用条件: crash report 对应的 Archive 包是在本机构建的 symbolicatecrash symbolicatecrash 是一个 exec (可执行文件), …

常见的BUG---1、虚拟机启动之后,突然发现没有ens33网卡

1、问题描述 今天一开启虚拟机,发现用XShell连接不上我的一台虚拟机,其他虚拟机是正常可以连接的,我稍微看了一下XShell的配置和Windows中的映射文件(hosts),都没有啥问题,然后我就知道应该是虚…

javap反编译字节码文件

javap -v main.class{public static void main(String[] args) {int a10;int b10;int cab;return;} } Classfile /F:/myCode/java/jvm/0710_demo01/untitled/target/classes/org/example/main.classLast modified 2023年7月10日; size 447 bytesMD5 checksum 675a0d673d66326b…

基于SpringBoot+Vue的影城管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

服务器中了malox勒索病毒的解决办法流程与解密方案

随着网络科技技术的不断发展,越来越多的企业开始重视数据,数字化办公已经成为众多企业工作的常态,因此数据的安全性受到了额外重视。但网络科技技术的发展不仅方便了我们的工作,也给企业的数据安全带来了很大威胁。近期&#xff0…

基于SpringBoot+Vue的疫情网课管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【H5】Promise的用法

系列文章 C#底层库–记录日志帮助类 本文链接:https://blog.csdn.net/youcheng_ge/article/details/124187709 文章目录 系列文章前言一、技术介绍二、项目源码2.1 Promise的状态2.2 Promise的结果2.3 Promise的then方法参数2.4 Promise的then方法获取数据 三、效果…

5G时代的材料新宠——液晶高分子聚合物

液晶高分子聚合物时80年代初期发展起来的一种新型高性能工程塑料,英文名为:Liquid Crystal Polymer 简称为LCP。 聚合方法以熔融缩聚为主,全芳香族LCP多辅以固相缩聚以制得高分子量产品。非全芳香族LCP常采用一步或二步熔融聚合制取产品。近年…

jwt介绍与使用

0.介绍 JWT(JSON Web Token)是一种开放标准,用于在双方之间安全地传输编码为 JSON 对象的信息。它是一个紧凑和自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。此信息可以进行验证和信任,因为它是经过数字签名的。JWT 可以使用机…

Python零基础入门(七)——Python中的选择和循环语句

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python入门专栏:《Python入门》欢迎阅读,一起进步!🌟🌟🌟 码字不易,如果觉得文章不…

大学英语四新视野 课后习题+答案翻译 Unit1~Unit8

Unit 1 Text A: Words in use 2022年6月16日 20:57 1 As the gender barriers crumbled, the number of women working as lawyers, doctors, or bankers began to increase significantly from the mid-20th century. 随着性别障碍的消除,从20世纪中期开始&am…

C语言陷阱——无符号数和有符号数的大小比较

C语言易错知识点——无符号数和有符号数的大小比较 我们来看两串代码 代码一&#xff1a; #include<stdio.h>int main() {int a -1;if (a > sizeof(int)){printf(">\n");}else{printf("<\n");}return 0; }代码二&#xff1a; #include…

学生用啥台灯最好?适合暑假学习的台灯推荐

孩子们终于迎来了他们的暑假&#xff0c;肯定不少孩子都已经计划好每天该玩什么游戏&#xff0c;该看什么电视了吧。这也是最让家长们头疼的一段时间&#xff0c;不仅每天要监督他们不要玩太久电子产品&#xff0c;花时间学习之外&#xff0c;还要担心他们视力健康。说到学习&a…

C++图形开发(11):小球碰到方块的判定

文章目录 1.有哪些情况&#xff1f;1.1 小球在方块左侧1.2 小球在方块上面1.3 小球在方块右侧 2.解决 1.有哪些情况&#xff1f; 今天来实现下小球碰到方块的判定 那么我们首先要明确的就是在什么时候&#xff0c;小球会碰到方块&#xff1f; 1.1 小球在方块左侧 第一个就是…

介绍Unity3D 游戏实战开发之英雄联盟

本次游戏项目为类dota游戏中的经典之作《英雄联盟》&#xff0c;向经典致敬。通过本次课程&#xff0c;你会学到网游开发模式、C#服务器开发、协议定制、Unity5.0新特性开发、UGUI应用、同步方案、解决问题思路、各种扩展工具的开发………&#xff01; 演示地址&#xff1a; w…

为什么企业必须重视数字化转型?

在当今快速发展的商业环境中&#xff0c;数字化转型对于企业的生存、增长和竞争力至关重要。数字化转型是指将数字技术集成到企业的各个方面&#xff0c;从根本上改变企业的运营方式以及为客户和利益相关者提供价值。企业优先考虑数字化转型的一些原因&#xff1a; 提高效率和生…

Wine编译环境搭建及使用完整流程详细笔记

Wine编译环境搭建及使用完整流程详细笔记 1. 背景及资源文件下载1.1 背景说明(实现目标)1.2 VMWare下载地址&#xff1a;1.3 Debian安装文件地址1.34 Ubuntu安装文件地址1.5 Wine源码下载地址1.5.1 Web下载地址1.5.2 Git下载地址 2. 常用文档2.1 Wine Document2.2 Build Wine D…

透彻理解 UART 通信的基本方法

UART是一种异步全双工串行通信协议&#xff0c;由 Tx 和 Rx 两根数据线组成&#xff0c;因为没有参考时钟信号&#xff0c;所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数&#xff0c;从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…