MySQL的锁机制

news2024/12/17 10:55:54

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.coloradmin.cn/o/1299219.html

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

相关文章

springboot mybatis手动事务

创建springboot项目 搭建最简单的SpringBoot项目-CSDN博客 引入mybatis和数据库依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><…

MacOS环境配置一系列问题的汇总,方便以后自己查看

环境配置一系列问题的汇总&#xff0c;方便以后自己查看 man brew报错“No manual entry for brew” 解决方法记录&#xff1a; 解决问题之前尝试的方法&#xff1a; Linking manuals from Homebrew1 https://apple.stackexchange.com/questions/111061/linking-manuals-f…

虚拟机安装 hyper—v 沙盒

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

力扣 4. 寻找两个正序数组的中位数

题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 My class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {i…

科学计算入门

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

04-详解Eureka注册中心的作用,具体配置,服务注册和服务发现

Eureka注册中心的作用 Eureka架构 远程调用的两个问题 服务的ip地址和端口号写死: 生产环境中服务的地址可能会随时发生变化,如果写死每次都需要重新修改代码多实例问题: 在高并发的情况下一个服务可以有多个实例形成一个集群,此时如果采用硬编码的方式只能访问服务的一个实…

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

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

[后端卷前端2]

绑定class 为什么需要样式绑定呢? 因为有些样式我们希望能够动态展示 看下面的例子: <template><div><p :class"{active:modifyFlag}">class样式绑定</p></div> </template><script>export default {name: "goo…

ffprobe命令行超详细使用详解

本文做为阅读ffprobe源码的前课程。为了之后方便理解ffprobe的源码,咱们先从ffprobe的命令学习。 课程内容如下: 文章目录 一、ffprobe主要选项说明1、每次使用ffprobe都打印编译环境的信息,太烦了2、如何分析媒体文件中存在的流信息3、如何指定查询某路流信息4、查看输入文…

蒙特霍尔问题(选择三扇门后的车与羊)及其贝叶斯定理数学解释

1. 蒙特霍尔问题 有一个美国电视游戏节目叫做“Let’s Make a Deal”&#xff0c;游戏中参赛者将面对3扇关闭的门&#xff0c;其中一扇门背后有一辆汽车&#xff0c;另外两扇门后是山羊&#xff0c;参赛者如果能猜中哪一扇门后是汽车&#xff0c;就可以得到它。 通常&#xf…

飞天使-linux操作的一些技巧与知识点2

TCP 的三次握手 第一次&#xff0c;客户端与服务端建立链接&#xff0c;需要发送请求连接的消息 第二次&#xff0c;服务端接口到数据后&#xff0c;返回一个确认的操作*&#xff08;至此客户端和服务端链路建立成功&#xff09; 第三次&#xff0c;服务端还需要发送要与客户端…

【小白专用】Apache2.4+PHP8.3+MYSQL的配置

1.下载PHP和Apache 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作为服务器的话&#xff0c;一定要下载Thread Safe的&#xff0c;否则没有php8apache2_4.dll这个文件&#xff0c; 如果使用IIS的请下载 NON Tread safe的 2.如果…

【报错栏】找不到依赖项

问题描述&#xff1a; 找不到依赖项 org.springframework.boot:spring-boot-starter-amqp:2.7.14 解决办法&#xff1a; 最终我的问题解决

激光打标机在智能手表上的应用:科技与时尚的完美结合

随着科技的飞速发展&#xff0c;智能手表已经成为我们日常生活中不可或缺的智能设备。而在智能手表制造中&#xff0c;激光打标机扮演着至关重要的角色。本文将详细介绍激光打标机在智能手表制造中的应用&#xff0c;以及其带来的优势和影响。 ​ 一、激光打标机在智能手表制…

C语言数组输出平行四边形问题问题

目录 1问题输出以下图形: 2解题思路&#xff1a; 3代码如下&#xff1a; 4运行代码&#xff1a; 注意图形问题就是找到行和列的规律&#xff0c;即可输出&#xff0c;比如我也可以输出反方向的平行四边行&#xff0c;代码如下&#xff1a; 运行结果&#xff1a;​编辑 5总…

Proteus仿真--基于NM24C08的EEPROM仿真设计

本文介绍基于NM24C08的EEPROM仿真设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 其中NM24C08是标准的2线总线接口的串行EEPROM&#xff0c;开机画面在LCD12864上显示 仿真图如下 仿真运行视频 Proteus仿真--基于NM24C08的EEPROM仿真设计 附完整Proteus仿真资料…

LINUX-ROS集成安装MQTT库步骤注意事项

环境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步骤 安装doxygen sudo apt install doxygen 构…

基于ssm铁岭河医院医患管理系统论文

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

Diffie-Hellman密钥交换协议

DH介绍 Diffie-Hellman密钥协议算法是一种确保共享密钥安全穿越不安全网络的方法。 这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥&#xff0c;然后可以用这个密钥进行加密和解密。 但是注意&#xff0c;这个密钥交换协议 只能用于密钥的交换&#xff0c;而…

LeetCode 每日一题 Day 9 ||简单dp

70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 示例 2&am…