Mysql中的读写锁,表锁和行锁,间隙锁

2023-10-29

Mysql数据库锁

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

锁的分类

从对数据操作的类型(读\写)分

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。

  • 写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

从对数据操作的粒度分

  • 表锁

  • 行锁

表锁(偏读)

特点:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

MyISAM引擎表锁

建表SQL

create table mylock (
    id int not null primary key auto_increment,
    name varchar(20) default ''
) engine myisam;

insert into mylock(name) values('a');
insert into mylock(name) values('b');
insert into mylock(name) values('c');
insert into mylock(name) values('d');
insert into mylock(name) values('e');

mylock,加读锁
在这里插入图片描述
1、读锁是共享锁,因此多线程共享,其它人也能读取到数据
2、当session1加读锁,进行更改时,修改失败,读锁期间不允许修改
3、当session2进行,修改时,对应线程会一直堵塞。读锁期间不允许修改,知道读锁unlock后,才可以修改

mylock加写锁
在这里插入图片描述
1、写锁是互斥锁,多线程间互斥访问
2、session1一旦获取到写锁,未释放前,其它线程连读取数据的机会都没有因此session2会堵塞。相当于java中的Reentrantlock,synchronized

Innodb引擎行锁

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。

事务ACID原则

事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性:

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。

  • 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构〈如B树索引或双向链表)也都必须是正确的。

  • 隔离性(lsolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。

  • 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

并发事务处理带来的问题

  • 更新丢失(Lost Update)
  • 脏读(Dirty Reads)
  • 不可重复读(Non-Repeatable Reads)
  • 幻读(Phantom Reads)

更新丢失(Lost Update)

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题――最后的事务的更新覆盖了由其他事务所做的更新。

例如,两个程序员修改同一java文件。每程序员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖前一个程序员所做的更改。

如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题。

脏读(Dirty Reads)

一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。

总之:事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。

不可重复读(Non-Repeatable Reads)

一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

总结:事务A读取到了事务B已经提交的修改数据,不符合隔离性。

幻读(Phantom Reads)

一个事务接相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读“。

**一句话:事务A读取到了事务B体提交的新增数据,**不符合隔离性。

事务隔离级别

”脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。

在这里插入图片描述
查看当前数据库的事务隔离级别

mysql> show variables like '%isolation%';
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set, 1 warning (0.00 sec)

innodb默认事务的隔离为可重复读

行锁示例

在这里插入图片描述

请添加图片描述

索引失效行锁变表锁

请添加图片描述

请添加图片描述

间隙锁

什么是间隙锁

当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”。

InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)。

例如:

数据表

id name
1 a
3 a
4 a
5 a

select id,name where id >= 1 and id <=5; 

如果此时insert 一行记录, 这一线程会被堵塞,因为2对应的记录行被间隙锁,锁住了

insert into (id,name) values (2,'a');

mysql会为1~5行全部加上行锁,虽然第2行没有数据,也会加上间隙锁,在session1事务没有commit之前,一直被锁住,其它session无法操作。

危害

因为Query执行过程中通过过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。

间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成很大的危害。

mysql锁定一行

使用 for update

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mysql中的读写锁,表锁和行锁,间隙锁 的相关文章

随机推荐

  • 二. Config 分布式服务配置中心 + Bus 消息总线

    目录 一 基础概述 二 Config 分布式服务配置中心 Bus 消息总线 实现数据刷新 Config server 服务 通过 Config Server 端读取配置文件的 Client 服务 最终实现的效果 一 基础概述 Bus 消息总
  • 关于中断请求标志位

    今天才发现我用了这么长时间的中断服务函数 竟然不知道中断请求标志位到底具体是什么意思 悲哀 一般就用了定时器中断服务函数 没关心中断请求标志位 今天才发现 原来定时器中断请求标志位就是定时器溢出标志位 定时器溢出时自动跳到相应中断向量处 当
  • 【渗透测试基础】文件上传

    1 文件上传漏洞简介 文件上传漏洞是指文件上传功能没有对上传的文件过严谨的过滤和合理的控制 而导致用户可以通过某些手段上传可执行的脚本文件 并通过脚本文件获取服务器权限 文件上传本身是没有问题的 有问题的是服务器如何处理 解释上传后的文件
  • Android富文本编辑器

    Android富文本编辑器 一款支持撤销 加粗 斜体 下划线 有序无序列表 对齐 改文字大小 改文字颜色 插入图片 插入视频等功能 并且可设置cookie 自定义素材操作菜单的的编辑器 github地址 https github com y
  • Onedrive服务器位置,私享空间-OneDrive:同步目录不要在C盘

    Windows 10自带的OneDrive也是一个不错网盘 可以同步文件和分享文件 首先 你得有一个Windows Live ID 其实就是Windows 10系统的账号 然后将文件放入OneDrive默认同步位置C Users 当前用户名
  • 初识Linux (四) 文件打包及目录管理命令

    打包压缩与搜索命令 此操作是在 红帽 7 内核 以root用户身份进行 1 tar 命令 tar 命令用于对文件进行打包压缩或解压 格式为 tar 选项 文件 tar参数及作用 c 创建压缩文件 x 解开压缩文件 t 查看压缩包内有那些文件
  • python函数的基础知识

    目录 一 函数的定义 二 函数的优点是什么 三 函数的组成部分 四 执行函数 五 函数的返回值 return 的作用停止函数体的运行 和break的功能一样 并且返回给这个函数一个值 六 函数的传参 函数的参数分为形参和实参 一 函数的定义
  • 矩阵相乘的几何意义

    参考 矩阵乘法的本质是什么 whitefang的回答 知乎 https www zhihu com question 21351965 answer 727385709 1 上边链接是我看的对矩阵相乘的几何意义最清楚的解释了 2 重点 A
  • 张钜楷:《黄金下周消息》国际黄金涨跌策略分析,期货白银操作建议

    黄金下周行情分析 黄金消息面解析 北京时间周五 1月7日 21 30 美国公布12月非农就业报告出炉 表现大幅不及预期 但失业率须创2020年2月来新低 截至发稿 现货黄金冲高7美元后回落近12美元至1784 78美元 盎司 具体数据显示
  • 教你如何打造出一个前端可视化监控系统

    还记得在我上一家公司中 某一大佬做了一个监控系统 牛逼哄哄 挺想研究他到底是怎么搞出来的 当然我们也不是拍拍脑袋干活的人 总不能人家咋干我们就咋干 下面先就介绍下 这样的平台到底有啥好处 背景 首先我们为什么要做前端系统呢 先看下面这张表
  • 华为OD机试真题-查找单入口空闲区域【2023Q1】【JAVA、Python、C++】

    题目描述 给定一个 m x n 的矩阵 由若干字符 X 和 O 构成 X 表示该处已被占据 O 表示该处空闲 请找到最大的单入口空闲区域 解释 空闲区域是由连通的 O 组成的区域 位于边界的 O 可以构成入口 单入口空闲区域即有且只有一个位
  • MySql基础--灵活运用sql语句

    数据库脚本 请勿随意修改本人数据 内藏玄机 可随意增加数据 补充 DISTINCT 去重 1 创建学生表 CREATE TABLE t student sid INT NOT NULL AUTO INCREMENT COMMENT 学号 s
  • HTML5中div section article的区别

    刚刚开始接触 HTML5 时 对它的标签很不适应 甚至一度有点反感 尤其是对 div section article 这几个标签 实在弄不清楚应该使用在什么场合下 div 这个标签是我们见得最多 用得最多的一个标签 本身没有任何语义 用作布
  • Google App Engine 的简易教程(转载)

    源地址 http peopleyun com p 868 本文将通过一个简单的例子 来介绍大家如何创建一个简单App Engine程序 首先 给大家介绍一下Google App Engine Google App Engine的介绍 Goo
  • 骰子布局

    一 骰子的布局 骰子的一面 最多可以放置9个点 下面 就来看看Flex如何实现 从1个点到9个点的布局 你可以到codepen查看Demo 如果不加说明 本节的HTML模板一律如下 div class box span class item
  • redis(9)、redis集群之redis Cluster使用

    redis技术目录 前提 redis集群分片 目前redis有两类方案 哈希槽 hash slot 代表方案 redis cluster 一致性哈希 代表方案 twemproxy codis 本篇是针对redis cluster配置实现 原
  • UE4_VR传送

    传送抛物线的计算 制作步骤 在BPC TraceInterfaction新建一个函数 ParabolicTrace 新建一个材质 M Teleport 把BlendMode 设置为透明的 Translucent TexCoord 相当于UV
  • 【论文阅读】Learning Convolutional Neural Networks for Graphs

    出版 ICML 2016 原文 http 211 81 63 130 cache 2 03 proceedings mlr press cb5795e96aa42362f86e2ba3a13c32af niepert16 pdf 卷积神经网
  • 卷积过程的一个动态图很形象

    卷积神经网络的卷积过程
  • Mysql中的读写锁,表锁和行锁,间隙锁

    Mysql数据库锁 锁是计算机协调多个进程或线程并发访问某一资源的机制 在数据库中 除传统的计算资源 如CPU RAM I O等 的争用以外 数据也是一种供许多用户共享的资源 如何保证数据并发访问的一致性 有效性是所有数据库必须解决的一个问