MySQL中的锁机制

抛砖引玉:多个查询需要在同一时刻进行数据的修改,就会产生并发控制的问题。我们需要如何避免写个问题从而保证我们的数据库数据不会被破坏。

锁的概念

读锁是共享的互相不阻塞的。多个事务在听一时刻可以同时读取同一资源,而相互不干扰。

写锁的排他的。一个写锁会阻塞其他写锁或读锁。出于安全考虑只有这样才能保证在给定的时间里只有一个事务能够执行写入,并防止其他事务读取正写入的同一资源。

锁带来的问题

通过锁定机制可以实现事务的隔离性要求,使得事务可以并发的工作,同时也带来了三个问题:脏读,不可重复读和丢失更新。

脏读

脏数据:未提交的数据

如果读到了脏数据即一个事务可以读取到另一个事务中未提交的数据那就违背了事务的隔离性。

所以脏读是指在不同的事务下,当前事务可以读取到另外事务的未提交的数据,简单来说就是可以读取到脏数据。

演示:

初始状态:

image-20230813233401790

将会话A,B设置隔离级别为RU

set session transaction isolation level READ UNCOMMITTED;

image-20230813235156382

会话A插入一条数据

image-20230814000655870

这时候事务B在此执行查询操作,会发现事务B读取到了事务A新增的数据。注意:此时事务A没有提交。

image-20230814000932266

不可重复读

在一个事务中两次读取到的数据是不一样的,这中情况被称为不可重复读。

与脏读的区别:脏读是读取到了未提交的数据,而不可重复读是读取到的却是已经提交的数据,但是违反了数据库事务一致性的要求。

演示:

image-20230814002516720

事务B插入一条数据并且提交

image-20230814002726465

事务A在此执行select语句,事务A读取到了事务B提交的数据

image-20230814002910671

一般来说不可重复读问题是可以接受的,因为读取到的是已经提交的数据,本身不会带来什么问题。例如Oracle 和 SQL Server的默认的事务隔离级别就是RC。 MySQL默认的事务隔离级别是RR。

在MySQL InnoDB中通过使用 Next-key lock 算法来避免不可重复读问题,并且将不可重复读问题定义为幻读(Phantom problem)

丢失更新

一个数据的更新会被另一个事务的更新操作所覆盖,从而导致数据的不一致性。

第一种丢失:

A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来:

时间取款事务A转账事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5汇入100元把余额改为1100元
T6提交事务
T7取出100元把余额改为900元
T8撤销事务
T9余额恢复为1000 元(丢失更新)

第二类丢失更新

A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失:

时间转账事务A取款事务B
T1开始事务
T2开始事务
T3查询账户余额为1000元
T4查询账户余额为1000元
T5取出100元把余额改为900元
T6提交事务
T7汇入100元
T8提交事务
T9把余额改为1100 元(丢失更新)

要避免丢失更新的发生,需要让事务在这种情况的操作变成串行化,而不是并行操作。即上面的select操作中加上排他锁。

MySQL锁的分类:

按照锁的粒度来说

MySQL主要包含三种类型(级别)的锁定机制:

全局锁:锁的是整个database。

表级锁:锁的是某个table。 (表排他锁,表共享锁,元数据锁,自增锁)

行级锁:锁的是某行数据,也可能锁定行之间的间隙。由某些存储引擎实现,比如InnoDB。

InnoDB的行级锁,按照锁定范围来说

分为四种:

1.记录锁(Record Locks):锁定索引中一条记录。

2.间隙锁(Gap Locks):要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索

引记录后面的值。

3.临键锁(Next-Key Locks):是索引记录上的记录锁和在索引记录之前的间隙锁的组合(间隙锁+记录

锁)。

4.插入意向锁(Insert Intention Locks):做insert操作时添加的对记录id的锁。

InnoDB的行级锁,按照功能来说

分为两种:

1.共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。

2.排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。

InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过

索引条件检索的数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

注意:插入意向锁

(1)插入意向锁是一种Gap锁,不是意向锁,在insert操作时产生。

(2)在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等 待。

(3)假设有一个记录索引包含键值4和7,不同的事务分别插入5和6,每个事务都会产生一个加在4-7之 间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。

(4)插入意向锁不会阻止任何锁,对于插入的记录会持有一个记录锁。

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

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

相关文章

Github上git lfs oid sha256文件无法下载的解决方案

问题:github上sha文件无法下载&文件超出限制 当我克隆Github上的一个库时,其中有一个包的内容格式如下: version https://git-lfs.github.com/spec/v1 oid sha256:一堆数字和字母 size 一堆数字 这堆东西类似百度网盘的下载链接和密码&a…

【Linux】应用层之HTTP协议

HTTP协议 应用层协议应用层的作用:为应用程序提供网络服务序列化的意义、为什么要将数据序列化?HTTP协议概述HTTP的协议格式请求响应GET方法和POST方法的出现的场景和区别? 应用层协议 在应用层,需要我们传递应用层所需特殊的数据…

分布式 - 服务器Nginx:一小时入门系列之负载均衡

文章目录 1. 负载均衡2. 负载均衡策略1. 轮询策略2. 最小连接策略3. IP 哈希策略4. 哈希策略5. 加权轮询策略 1. 负载均衡 跨多个应用程序实例的负载平衡是一种常用技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置。‎使用 nginx 作为非常有效的HT…

AP2915DC-DC降压恒流驱动IC LED电源驱动芯片 汽车摩托电动车灯

AP2915 是一款可以一路灯串切换两路灯串的降压 恒流驱动器,高效率、外围简单、内置功率管,适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功 率管输出功率可达 12W,电流 1.2A。 AP2915 一路灯亮切换两路灯亮,其中一路灯亮可 以全亮&a…

Dedecms V110最新版RCE---Tricks

前言 刚发现Dedecms更新了发布版本,顺便测试一下之前的day有没有修复,突然想到了新的tricks去实现RCE。 文章发布的时候估计比较晚了,一直没时间写了。 利用 /uploads/dede/article_string_mix.php /uploads/dede/article_template_rand.…

《人工智能大模型体验报告2.0》发布

ChatGPT 崛起引发新一轮生成式AI热潮,国内科技企业纷纷布局。据不完全统计,截至目前,国内大模型数量已达上百个。在这些大模型中,谁的表现最好,智能性最高,用户体验最强?8月12日,新华…

科研经费的来源有哪些?

目前,高校在我国科技创新中发挥着越来越重要的作用,自然高校获得经费也越来越多。一所高校的科研经费充足,越有利于科研学术水平的提高。那么科研经费的来源有哪些呢? 1. 国家拨款 对于高校的科研发展享有国家的重点支持。近年来…

C语言笔试训练【第12天】

文章目录 1、请阅读以下程序,其运行结果是( )2、假设编译器规定 int 和 short 类型长度分别为32位和16位,若有下列C语言语句,则 y 的机器数为( )3、下列程序的输出结果是什么( &…

【C++面向对象】--- 继承 的奥秘(下篇)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…

印度货代专线【我国到印度专线有哪些方式】

随着全球贸易的不断发展,我国与印度之间的贸易往来也日益频繁。作为两个人口最多的国家之一,中国和印度之间的货物运输需求不断增长。为了满足这一需求,印度货代专线应运而生,为进出口商提供高效、可靠的货物运输服务。本文将探索…

docsify gitee 搭建个人博客

docsify & gitee 搭建个人博客 文章目录 docsify & gitee 搭建个人博客1.npm 安装1.1 在Windows上安装npm:1.2 在macOS上安装npm:1.3 linux 安装npm 2. docsify2.1 安装docsify2.2 自定义配置2.2.1 通过修改index.html,定制化开发页面…

【Linux】—— 进程程序替换

目录 序言 (一)替换原理 1、进程角度——见见猪跑 1️⃣ 认识 execl 函数 2、程序角度——看图理解 (二)替换函数 1、命名理解 2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve…

uni-app之app上传pdf类型文件

通过阅读官方文档发现,uni.chooseFile在app端不支持非媒体文件上传; 可以使用这个插件,验证过可以上传pdf;具体使用可以去看文档 插件地址 就是还是会出现相机,这个可能需要自己解决下 实现功能:上传只能上…

Redis——Redis.conf详解+Redis持久化(RDB和AOF)+Redis订阅发布

配置文件 redis启动时通过配置文件启动 原生配置文件全文在网上随便搜索一下就能找到了。 单位 配置文件 unit单位 对大小写不敏感 包含 类比import,将其他的配置文件引入 网络 bind 127.0.0.1 // 绑定ip protected-mode yes //是否受保护 po…

【调整奇数偶数顺序】

调整奇数偶数顺序 1.题目 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。 2.题目分析 这道题首先用到的方法是冒泡排序的思想,首先通过冒泡排序…

Prometheus的搭建与使用

一、安装Prometheus 官网下载地址:Download | Prometheus 解压:tar -zxvf prometheus-2.19.2.linux-amd64.tar.gz重命名: mv prometheus-2.19.2.linux-amd64 /home/prometheus进入对应目录: cd /home/prometheus查看配置文件&am…

微服务与Nacos概述-5

引入OpenFeign 添加依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.alibaba.cloud</groupId>…

【Windows 常用工具系列 8 -- 修改鼠标光标(指针)大小和颜色的快速方法方法】

文章目录 修改方法 上篇文章&#xff1a;Windows 常用工具系列 7 – 禁用win10自带的微软输入法 修改方法 Win键 i 快捷键进入设置页面&#xff0c;然后输入光标... 就会跳出修改鼠标大小与光标颜色的选项。 Win键是在计算机键盘左下角Ctrl和Alt键之间的按键 根据自己的需求…

浏览器 - 事件循环机制详解

目录 1&#xff0c;浏览器进程模型进程线程浏览器的进程和线程1&#xff0c;浏览器进程2&#xff0c;网络进程3&#xff0c;渲染进程 2&#xff0c;渲染主线程事件循环异步同步 JS 为什么会阻塞渲染任务优先级 3&#xff0c;常见面试题1&#xff0c;如何理解 js 的异步2&#x…

210、仿真-基于51单片机灭火小车超声波避障温度烟雾控制报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…
最新文章