MySQL的锁机制

1.简介

MySQL的隔离性是由锁机制来保证的。锁是计算机协调多个进程或线程并发地访问某一资源你的机制。当多线程并发地访问某个数据时,尤其是在涉及金钱等安全敏感性数据的时候,需要保证数据在任意时刻最多只有一个线程可以对其进行修改,从而保证数据的一致性和完整性。

2.MySQL并发事务访问相同记录

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

2.1 读-读情况

读-读情况就是多个事务同时读取某条或多条相同的记录,由于读操作本身不会改变数据,因此是不存在任何数据安全问题的。

2.2 写-写情况

写-写情况即并发事务相继对相同的记录进行修改,在这种情况下会产生脏写的问题,任何一种隔离级别都不允许这种情况的产生,因此多个未提交的事务对同一条记录进行修改时,会让它们排队去执行,这个排队操作是通过锁来保证。这个所谓的锁其实是一个内存中的结构,在事务执行前本来是没有锁的,也就是说一开始是没有锁结构和记录进行关联的,如图所示:
在这里插入图片描述
当一个事物想要对这条记录进行改动的时候,首先会看看内存中有没有与这条记录关联的表结构,当没有的时候就会在内存中生成一个锁结构与之关联。比如事务T1需要对记录进行修改,就需要生成一个索结构与之关联,如下图:
在这里插入图片描述
在锁结构里有很多信息,为了简化理解,就拿两个比较重要的字段展示:

  • trx信息:代表这个锁结构是哪个事务生成的。
  • is waiting:表示当前事务是否在等待

当T1改动这条记录后,就会生成一个索结构与对应的记录进行关联,由于之前没有别的事务对该记录进行修改,所以is waiting是false。我们把这个场景称之为获取锁成功,之后就可以进行后续操作了。
在T1事务对该记录进行提交之前,事务T2也想对该记录进行修改,那么会先看看有没有锁结构与该记录进行关联,发现存在锁结构与该记录关联,那么T2会再生成一个自己的索结构与该记录进行关联,不过此时的is wating则为true,因为事务T2需要等待事务T1提交后才能对该记录进行修改。这个场景我们就称之为获取锁失败。如下图:
在这里插入图片描述
在事务T1提交后,会将与该记录关联的锁结构释放掉,然后查看是否有其他线程等待获取锁,发现T2事务在等待获取锁,会将T2锁结构的is wating改为false,且唤醒T2事务对应的线程,然后T2事务就可以正常执行了。如下图:
在这里插入图片描述

2.3 读-写情况

读-写或者写-读的情况,即一个事物在读取某条记录的时候,其他事务在对该记录进行修改,那么可能会产生 脏读、不可重复读、幻读的问题。MySQL在RR级别就解决了幻读的问题。

2.4 并发问题的读解决方案

怎么解决脏读、不可重复读、幻读的问题呢?有两种解决方案。

  • 方案一:读操作使用MVCC,写操作加锁
    所谓MVCC就是多版本并发控制,当进行常规的select操作(即简单的select 语句,不带for update或者lock in share mode)的时候,这时是快照读。此时在开启事务的时候会维护一个当前活跃事务(就是已开启但是还未提交的事务)列表-trx_list,里面的记录了当前活跃事务的id,由于事务的id是随着开启时间递增的,所以在最小事务id之前的事务都已经提交了,这些事务的id对于当前事务来说自然是可见的。最大事务id则是系统将要分配的下一个事务id,所以在最大事务id之后的事务对于当前事务来说都是未开启的,这些事务所做的修改对于当前事务来说自然是不可见的。同时记录在undo log中维护了各个事务对其修改的历史版本,所以根据事务id之间的关系就可以判断当前事务应该看到该记录的哪个事务版本的数据。由于当前读在开启事务的时候会生成一个ReadView,其中维护了上述的trx_list,且在本事务中多次进行查询都是用的最初的ReadView,因此在本事务中不论读多少次,某个记录的值都不会变,这就解决了脏读、不可重复读的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

class070 子数组最大累加和问题与扩展-上【算法】

class070 子数组最大累加和问题与扩展-上【算法】 code1 53. 最大子数组和 // 累加和最大子数组和 // 给你一个整数数组 nums // 请你找出一个具有最大累加和的非空子数组 // 返回其最大累加和 // 测试链接 : https://leetcode.cn/problems/maximum-subarray/ dp[i]&#xff…

Aloha 机械臂的学习记录2——AWE:AWE + ACT

继续下一个阶段: Train policy python act/imitate_episodes.py \ --task_name [TASK] \ --ckpt_dir data/outputs/act_ckpt/[TASK]_waypoint \ --policy_class ACT --kl_weight 10 --chunk_size 50 --hidden_dim 512 --batch_size 8 --dim_feedforward 3200 \ --n…

如何轻松恢复 Windows 中删除的文件夹

我们都曾经历过这样的事,而且我们中的大多数人可能很快就会再次这样做。我们讨论的是在 Windows 中按“Delete”或“ShiftDelete”键意外删除重要文件夹的情况。 如果您刚刚按下删除键且未超过 30 天,或者尚未清空回收站,则可以恢复文件夹。…

uniapp获取wifi连接状态

当使用Uniapp开发移动应用时,我们经常需要获取设备的连接状态,特别是WiFi连接状态。下面是一个简短的关于在Uniapp中获取WiFi连接状态的博客: 在Uniapp中,要获取设备的WiFi连接状态,我们可以利用uni.getNetworkType接…

统信UOS_麒麟KYLINOS上跨架构下载离线软件包

原文链接:统信UOS/麒麟KYLINOS上跨架构下载离线软件包 hello,大家好啊,今天给大家带来一篇在统信UOS/麒麟KYLINOS上跨架构下载离线软件包的实用教程。在我们的日常工作中,可能会遇到这样的情况:需要为不同架构的设备下…

键盘打字盲打练习系列之反复练习——3

一.欢迎来到我的酒馆 盲打,反复练习! 目录 一.欢迎来到我的酒馆二.数字&符号键位指法1.数字键位指法2.符号键位指法 三.反复练习 二.数字&符号键位指法 前面的一个章节重点介绍了主键盘区字母键位的指法:基准键位指法、" QWERTY…

WireShark监控浏览器登录过程网络请求

软件开发中经常前后端扯皮。一种是用Chrome浏览器的开发者工具 来看网络交互,但是前提是 网络端口的确是通的。 WireShark工作在更低层。 这个工具最大的好处,大家别扯皮,看网络底层的log,到底 你的端口开没开, 数据…

idea中run和debug是灰色的

【现象】idea中run和debug是灰色的 点击 旁边的Add Configuration…一看都是空白 【解决方法】: npm点开之后 【结果】

【Java+MySQL】前后端连接小白教程

目录 🍭【IntelliJ IDEA】操作 🍭1. 连接MySQL数据库 🌈1.1 错误解决 🍭2. 操作MySQL数据库 🌈2.1 双击查看表数据 🌈2.2 编写SQL脚本 🍭【IntelliJ IDEA】 IntelliJ IDEA是由JetBrains公司…

js 复制粘贴板,当clipboardjs 不好使怎么办?

最近项目中做一个很常见的复制粘贴的功能耽误了比较长的时间特此记录&#xff0c;在往常这个功能直接用 clipboard 做就行了&#xff0c;但是这次却发现复制功能不好使了&#xff0c;虽然走了复制成功的回调&#xff0c;但是粘贴板并没有复制的内容。代码如下 <div v-for&q…

虚拟机安装 hyper—v 沙盒

一、下载系统镜像 1、确认电脑内存在8G及以上并提前准备完整的系统镜像 安装Hyper-V并重启电脑后打开程序选择虚拟机 选择安装位置并设置保留第一代的虚拟参数即可开始分配内存&#xff0c;根据自己的需求进行设置 右键虚拟机启动并开始运行&#xff0c;进行镜像系统的安装便完…

初识人工智能,一文读懂强化学习的知识文集(5)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Python之html2text,清晰解读HTML内容!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python之html2text&#xff0c;清晰解读HTML内容&#xff0c;全文3900字&#xff0c;阅读大约10分钟。 HTML是Web开发中常见的标记语言&#xff0c;但有时我们需要将HTML内容…

【MyBatis系列】MyBatis字符串问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

软件设计师——计算机组成原理(二)

&#x1f4d1;前言 本文主要是【计算机组成原理】——软件设计师——计算机组成原理的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

ffmpeg之ffprobe.c源码分析一---大流程及核心代码分析

文章目录 前言为什么学习ffprobe源码源码调试main()函数重要流程函数分析open_input_file函数分析avformat_match_stream_specifier函数分析read_packets函数分析本篇文章带你打通ffprobe源码的脉络。 关注公众号免费看: 前言 注:本文章全凭个人经验以及平时学习所记录,由…

Git merge 与 Git rebase 与 Git fetch

Git merge 与 Git rebase 看这个图就行了 git merge、git rebase 和 git fetch 是 Git 中的三个不同的命令&#xff0c;它们分别用于不同的目的。以下是它们的主要区别&#xff1a; git merge&#xff08;合并&#xff09;&#xff1a; 用途&#xff1a; 用于将一个分支的更改…

optional

参考资料&#xff1a; Java8 Optional用法和最佳实践 - 掘金 一、背景 根据Oracle文档&#xff0c;Optional是一个容器对象&#xff0c;可以包含也可以不包含非null值。Optional在Java 8中引入&#xff0c;目的是解决 NullPointerExceptions的问题。本质上&#xff0c;Optio…

【C语言】内联函数

一、内联函数 在C语言中&#xff0c;内联函数&#xff08;Inline function&#xff09;是一种代码优化技术&#xff0c;它的目的是减少函数调用的开销。内联函数通知编译器在每个函数调用的位置插入函数的实际代码&#xff0c;而不是进行传统的函数调用。这避免了调用函数时的…

什么是特征图?

在卷积神经网络&#xff08;CNN&#xff09;中&#xff0c;特征图是在传递给卷积层的图像上发生卷积操作后卷积层的输出。 特征图是如何形成的&#xff1f; 在上面的插图中&#xff0c;我们可以看到特征图是如何从提供的输入图像中形成的。 要发送到卷积层的图像是一个包含像…
最新文章