你知道MySQL锁,到底在锁什么吗?

【MySQL】如何理解MySQL的锁(图文并茂,一网打尽) 这里博主整理我们常见的MySQL中锁的概念,还介绍了面试中 常问的关于乐观锁、悲观锁的 一些特点。后续还有更多内容与大家分享~ 阅读详情

前言

MySQL锁写过不少,那么这篇文章还是来和大家聊一聊MySQL的锁。

只要学计算机,「锁」永远是一个绕不过的话题。MySQL锁也是一样。

一句话解释MySQL锁:

MySQL锁是解决资源竞争的一种方案。

短短一句话却包含了3点值得我们注意的事情:

  1. 对什么资源进行竞争?

  2. 竞争的方式(或者说情形)有哪些?

  3. 锁是如何解决竞争的?

这篇文章开始带你循序渐进地理解这几个问题。

1. 资源的竞争方式

MySQL对资源的操作无非就是读、写两种方式,但是由于事务并发执行的存在,因此对同一资源的并发访问存在3种形式:

  • 读—读:并发事务同时读取相同资源。由于读操作不会改变资源本身,因此这种情况下并不存在并发安全性问题。

  • 读—写/写—读:一个事务对资源进行读操作,另一个事务对资源进行写操作。

  • 写—写:并发事务同时对同一个资源进行写操作。

2. 读—写/写—读下的问题

假设一种情形,一个事务先对某个资源进行读操作,然后另一个事务再对该资源进行写操作,如果两个事务到此为止,必然不会导致并发问题。

可是事务这种东西,一般情况下就是包含有很多个子操作啊。

2.1. 幻读

想象一下啊,假设事务T1和T2并发执行,T1先查找了所有name为「王刚蛋」的用户信息,此时发现拥有这个硬汉名字的用户只有一个。然后T2插入了一个同样叫做「王刚蛋」的用户的信息,并且提交了。

2.2. 不可重复读

再来,同样是T1和T2两个事务,T1通过id = 1查询到了一条数据,然后T2紧接着UPDATE(DELETE也可以)了该条记录,不同的是,T2紧接着通过COMMIT提交了事务。

​此时,T1再次执行相同的查询操作,会发现数据发生了变化,name字段由「王刚蛋」变成了「蝉沐风」。

如果一个事务读到了另一个已提交事务修改过的(或者是删除的)数据,而导致了前后两次读取的数据不一致的情况,这种事务并发问题叫做不可重复读。

2.3. 脏读

事情还没结束,假设T1和T2都要访问user_innodb表中id为1的数据,不同的是T1先读取数据,紧接着T2修改了数据的name字段,需要注意的是,T2并没有提交!

​此时,T1再次执行相同的查询操作,会发现数据发生了变化,name字段由「王刚蛋」变成了「蝉沐风」。

如果一个事务读到了另一个未提交事务修改过的数据,而导致了前后两次读取的数据不一致的情况,这种事务并发问题叫做脏读。

2.4. 锁与MVCC的关系

总结一下:我们在读—写,写—读的情况下会遇到3种读不一致性的问题,脏读、不可重复读以及幻读。

那写—写呢?很显然,在不做任何措施的情况下,并发会出现更大的问题。那该怎么办呢?

一切的并发问题都可以通过串行化解决,但是串行化效率太低了!

再优化一下,一切并发问题都可以通过加锁来解决,这种方案我们称为基于锁的并发控制(Lock Bases Concurrency Control, LBCC)!但是在读多写少的环境下,客户端连读取几条记录都需要排队,效率还是太低了!

因此,MySQL的设计者为事务之间的隔离性提供了不同的级别,使得开发者可以根据自己的业务场景设置不同的隔离级别,来解决(或者部分解决)读—写/写—读下的读一致性问题,而不是一上来就加锁。

这种机制叫做MVCC,如果你对这个概念不是很了解,我建议你暂停一下,读一下我的事务的隔离性与MVCC这篇文章,写得贼好!!(自卖自夸一下)

那有了MVCC是不是在读—写/写—读的情况下就不需要锁了呢?那也不是。

MVCC解决的是读—写/写—读中“比较纯粹的读”遇到的一致性问题,原谅我,这是我自己编的词儿。那什么是不纯粹的?拿存款业务举个例子。

假设陀螺要存一笔钱,系统需要先把陀螺的余额读出来,然后在余额的基础上加上本次存款的金额,最后再写入到数据库中。在将余额读出来之后,如果不想让其他事务继续访问该余额,直到整个存款事务完成之后,其他事务才可以对该余额继续进行操作,这种情况下就必须为余额的读取操作添加锁。

再总结一下:MVCC是MySQL默认的解决读—写/写—读下一致性问题的方式,不需要加锁。而锁是实现一致性的最终兜底方案,在某些特殊场景下,锁的使用不可避免。

说得更准确一点,MVCC是MySQL在READ COMMITTED、REPEATABLE READ这两种隔离级别之下执行普通SELECT操作时默认解决一致性问题的方式。 具体为什么只是这两种隔离级别,建议你看看事务的隔离性与MVCC。

2.5. 锁与事务的关系

事务是多个操作的集合,比如我们可以把「把大象装冰箱」这件事情作为一个事务。

事务有A(原子性)、C(一致性)、I(隔离性)、D(持久性)4大特性,而锁就是实现隔离性的其中一种方案(比如还有MVCC等方案)。

事务的隔离性针对不同场景需求又实现了不同的隔离级别,不同的隔离级别下,事务使用锁的方式又会有所不同。举个例子。

在READ COMMITTED、REPEATABLE READ这两种隔离级别之下,SELECT操作是不需要加锁的,直接使用MVCC机制即可满足当前隔离级别的需求。但是在SERIALIZABLE隔离级别,并且在禁用自动提交时(autocommit=0),MySQL会将普通的SELECT语句转化为SELECT ... LOCK IN SHARE MODE这样的加锁语句,如果你看不懂这句话也没关系,你只需要知道MySQL自动加锁了就行,更详细的下文再说。

另外,一个事务可能会加很多个锁,但是某个锁一定只属于一个事务。这就好比一个管理员可以管理多个保险柜,一个保险柜一定只被一个管理员管理。

3. 写—写情况

写—写的情况下肯定要加锁的了,所以接下来终于要聊一聊锁了。

我们首先研究一下锁住的东西的大小,也就是锁的粒度。

4. 锁的粒度

举一个非常应景的例子。疫情防控的时候,是封锁整个小区还是封锁某栋楼的某个单元,这完全是两种概念。

对应到MySQL锁的粒度,那就是表锁和行锁。

很容易想到,封锁小区的行为远比封锁某栋楼某单元的行为粗旷,因此,

从锁定粒度上来看,表锁 > 行锁

直接堵住小区的门口要比进入小区找到具体某栋楼的某个单元要快不少,因此,

从加锁效率上来看,表锁 > 行锁

直接锁住小区大概率会影响其他楼居民的正常生活和各种社会活动的开展,而锁住某栋楼某单元顶多影响这一个单元的居民的生活,因此,

从冲突概率来看,表锁 > 行锁

从并发性能来看,表锁 < 行锁

MySQL支持很多存储引擎,而不同的存储引擎对锁的支持也不尽相同。对于MyISAM、MERGE、MEMORY这些存储引擎而言,只支持表锁;而InnoDB存储引擎既支持表锁也支持行锁,下文讨论的所有内容均针对InnoDB存储引擎。

说完锁的粒度,还有一件事情需要我们仔细考虑一下。上文说过,READ COMMITTED、REPEATABLE READ这两种隔离级别之下,SELECT操作默认采用MVCC机制就可以了,压根儿不需要加锁,那么问题来了,万一我就是想加锁呢?

你可能会说,“简单啊,那就加锁!把数据锁死!除了我谁也别动!”

很好,但是对于大部分读—读而言,由于不会出现读一致性问题,所以不让其他事务进行读操作并不合理。

你可能又说,“那行吧,那就让读操作加锁的时候允许其他事务对锁住的数据进行读操作,但是不允许写操作。”

嗯,想得确实更细致了一些。但是再想想我上文中举过的陀螺存钱的例子,有时候SELECT操作需要独占数据,其他事务既不能读,更不能写。

我们把这种共享和排他的性质称为锁的基本模式。

5. 锁的基本模式

5.1. 共享锁

共享锁(Shared Lock),简称S锁,可以同时被多个事务共享,也就是说,如果一个事务给某个数据资源添加了S锁,其他事务也被允许获取该数据资源的S锁。

由于S锁通常被用于读取数据,因此也被称为读锁。

那怎么给数据添加S锁呢?

我们可以用 SELECT ... LOCK IN SHARE MODE; 的方式,在读取数据之前就为数据添加一把S锁。如果当前事务执行了该语句,那么会为读取到的记录添加S锁,同时其他事务也可以使用SELECT ... LOCK IN SHARE MODE; 方式继续获取这些数据的S锁。

我们通过以下的例子验证一下S锁是否可以重复获取。

5.2. 排他锁

排他锁(Exclusive Lock),简称X锁。只要一个事务获取了某数据资源的X锁,其他的事务就不能再获取该数据的X锁和S锁。

由于X锁通常被用于修改数据,因此也被称为写锁。

X锁的添加方式有两种,

  1. 自动添加X锁

  2. 我们对记录进行增删改时,通常情况下会自动对其添加X锁。

  3. 手动加锁

  4. 我们可以用 SELECT ... FOR UPDATE; 的方式,在读取数据之前就为数据添加一把X锁。如果当前事务执行了该语句,那么会为读取到的记录添加X锁,这样既不允许其他事务获取这些记录的S锁,也不允许获取这些记录的X锁。

我们用下面的例子验证一下X锁的排他性。

通常情况下,事务提交或结束事务时,锁会被释放。

6. 意向锁

6.1. 背景

前面提到的S锁和X锁的语法规则其实是针对记录的,也就是行锁,原因是InnoDB中行锁用的最多。如果将锁的粒度和锁的基本模式排列组合一下,就会出现如下4种情况:

  • 行级S锁

  • 行级X锁

  • 表级S锁

  • 表级X锁

那么接下来的描述,也就顺理成章了。

如果事务给一个表添加了表级S锁,则:

  • 其他事务可以继续获得该表的S锁,但是无法获取该表的X锁;

  • 其他事务可以继续获得该表某些行的S锁,但是无法获取该表某些行的X锁。

如果事务给一个表添加了表级X锁,则:

  • 不论是该表的S锁、X锁,还是该表某些行的S锁、X锁,其他事务都只能干瞪眼儿,啥也获取不了。

挺好理解的吧,总之就是S锁只能和S锁相容,X锁和其他任何锁都互斥。问题来了,虽然用的不多,但是万一我真的想给整个表添加一个S锁或者X锁怎么办?

假如我要给表user添加一个S锁,那就必须保证user在表级别上和行级别上都不能有X锁,表级别上还好说一点,无非就是1个内存结构罢了,但是行X锁呢?必须得逐行遍历是否有行X锁吗?

同理,假如我要给表user添加一个X锁,那就必须保证user在表级别上和行级别上都不能有任何锁(S和X都不能有),难不成得逐行遍历是否有S或X锁吗?

遍历是不可能遍历的!这辈子都不可能遍历的!于是,意向锁(Intension Lock)诞生了。

6.2. 概念

我们要避免遍历,那最好的办法就是在给行加锁时,先在表级别上添加一个标识。

  • 意向共享锁(Intension Shared Lock):简称IS锁,当事务试图给行添加S锁时,需要先在表级别上添加一个IS锁;

  • 意向排他锁(Intension Exclusive Lock):简称IX锁,当事务试图给行添加X锁时,需要先在表级别上添加一个IX锁。

这样一来:

  • 如果想给user表添加一个S锁(表级锁),就先看一下user表有没有IX锁;如果有,就说明user表的某些行被加了X锁(行锁),需要等到行的X锁释放,随即IX锁被释放,才可以在user表中添加S锁;

  • 如果想给user表添加一个X锁(表级锁),就先看一下user有没有IS锁或IX锁;如果有,就说明user表的某些行被加了S锁或X锁(行锁),需要等到所有行锁被释放,随即IS锁或IX锁被释放,才可以在user表中添加X锁。

需要注意的是,意向锁和意向锁之间是不冲突的,意向锁和行锁之间也不冲突。 只有在对表添加S锁或X锁时才需要判断当前表是否被添加了IS锁或IX锁,当为表添加IS锁或IX锁时,不需要关心当前表是否已经被添加了其他IS锁或IX锁。

目前为止MySQL锁的基本模式就介绍完了,接下来回到这片文章的题目,MySQL锁,锁住的到底是什么?由于InnoDB的行锁用的最多,这里的锁自然指的是行锁。

7. 行锁的原理

既然都叫行锁了,我们姑且猜测一下,行锁锁住的是一行数据。我们做个实验。

7.1. 没有任何索引的表

我们先创建一张没有任何索引的普通表,语句如下

CREATE TABLE `user_t1` ( `id` int DEFAULT NULL, `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

表中数据如下:

mysql> SELECT * FROM user_t1; +------+-------------+ | id | name | +------+-------------+ | 1 | chanmufeng | | 2 | wanggangdan | | 3 | wangshangju | | 4 | zhaotiechui | +------+-------------+

接下来我们在两个session中开启两个事务。

  • 事务1,我们通过WHERE id = 1“锁住”第1行数据;

  • 事务2,我们通过WHERE id = 2"锁住"第2行数据。

​一件诡异的事情是,第2个加锁的操作被阻塞了。实际上,T2中不管我们要给user_t1中哪行数据加锁,都会失败!

为什么我SELECT一条数据,却给我锁住了整个表?这个实验直接推翻了我们的猜测,InnoDB的行锁并非直接锁定Record行。

为什么没有索引的情况下,给某条语句加锁会锁住整个表呢?别急,我们继续。

7.2. 有主键索引的表

我们再创建一个表user_t2,语句如下:

CREATE TABLE `user_t2` ( `id` int NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

和user_t1的不同之处在于为id创建了一个主键索引。表中数据依然如下:

mysql> SELECT * FROM user_t2; +------+-------------+ | id | name | +------+-------------+ | 1 | chanmufeng | | 2 | wanggangdan | | 3 | wangshangju | | 4 | zhaotiechui | +------+-------------+

同样开启两个事务:

  • 事务1,通过WHERE id = 1“锁住”第1行数据;

  • 事务2依然使用WHERE id = 1尝试加锁,加锁失败;使用WHERE id = 2尝试加锁,加锁成功。

​既然锁的不是Record行,难不成锁的是id这一列吗?

我们再做最后一个实验。

7.3. 有唯一索引的表

我们再创建一个表user_t3,语句如下:

CREATE TABLE `user_t3` ( `id` int NOT NULL, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY (`uk_name`) (`name`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;

和user_t2的不同之处在于为name列创建了一个唯一索引。表中数据依然如下:

mysql> SELECT * FROM user_t3; +------+-------------+ | id | name | +------+-------------+ | 1 | chanmufeng | | 2 | wanggangdan | | 3 | wangshangju | | 4 | zhaotiechui | +------+-------------+

​两个事务:

  • 事务1,通过name字段 “锁住”name为“chanmufeng”的数据;

  • 事务2依然使用WHERE name = “chanmufeng” 尝试加锁,可以预料,加锁失败;使用WHERE id = 1尝试给同样的行加锁,加锁失败。

通过3个实验我们发现,行锁锁住的既不是Record行,也不是Column列,那到底锁住的是什么?我们对比一下,上文的3张表的不同点在于索引不同,其实InnoDB的行锁,就是通过锁住索引来实现的。

索引是个啥?再给你推荐一下我之前写的文章,

  • 图解|12张图解释MySQL主键查询为什么这么快

  • 图解|这次,彻底理解MySQL的索引

接下来回答3个问题。

8. 三个问题

8.1. 锁住索引?没有索引怎么办?

你说锁住索引?如果我不创建索引,MySQL锁定个啥?

如果我们没有设置主键,InnoDB会优先选取一个不包含NULL值的Unique键作为主键,如果表中连Unique键也没有的话,就会自动为每一条记录添加一个叫做DB_ROW_ID的列作为默认主键,只不过这个主键我们看不到罢了。

下图是数据的行格式。看不懂的话强烈推荐看一下我上面给出的两篇文章,说得非常明白。

8.2. 为什么第一个实验会锁表?

因为SELECT没有用到索引,会进行全表扫描,然后把DB_ROW_ID作为默认主键的聚簇索引都给锁住了。

8.3. 为什么通过唯一索引给数据加锁,主键索引也会被锁住?

不管是Unique索引还是普通索引,它们的叶子结点中存储的数据都不完整,其中只是存储了作为索引并且排序好的列数据以及对应的主键值。

因此我们通过索引查找数据数据实际上是在索引的B+树中先找到对应的主键,然后根据主键再去主键索引的B+树的叶子结点中找到完整数据,最后返回。所以虽然是两个索引树,但实际上是同一行数据,必须全部锁住。

下面给了一张图,让不了解索引的朋友大致了解一下。上半部分是name列创建的唯一索引的B+树,下半部分是主键索引(也叫聚簇索引)。

假如我们通过WHERE name = '王钢蛋'对数据进行查询,会先用到name列的唯一索引,最终定位到主键值为1,然后再到主键索引中查询id = 1的数据,最终拿到完整的行数据。

9. 总结

至此,我已经回答了文章开头的绝大多数问题。

MySQL锁,是解决资源竞争问题的一种手段。有哪些竞争呢?读—写/写—读,写—写中都会出现资源竞争问题,不同的是前者可以通过MVCC的方式来解决,但是某些情况下你也不得不用锁,因此我也顺便解释了锁和MVCC的关系。

然后介绍了MySQL锁的基本模式,包括共享锁(S锁)和排他锁(X锁),还引入了意向锁。

最后解释了锁到底锁的是什么的问题。通过3个实验,最终解释了InnoDB锁本质上锁的是索引。

本文并没有介绍MySQL中具体的锁算法,也就是如何解决资源竞争的,比如Record Locks、Gap Locks、Next-Key Locks等,更细节的内容下以后有时间再见喽~

资源竞争与并发控制 非常浅显的讲述《资源竞争与并发控制》。 1.应用层并发控制?不是重点 2.Lost Update?乐观锁与悲观锁 3.隔离级别:脏读Dirty Read+幻读Phantom Read 4.InnoDB锁与多版本控制? 5.意向锁? 6.事务传播行为? 立即下载

相关推荐

主成分分析避坑指南:为什么你的PCA结果总是不理想?

本文深入剖析了主成分分析(PCA)在实际应用中效果不佳的常见原因与解决方案。针对数据标准化、协方差矩阵选择、主成分数量确定、载荷矩阵解读等关键环节,提供了详细的避坑指南和诊断方法,并探讨了PCA的局限性及非线性数据结构下的备选方案,帮助数据分析师获得更稳健、可解释的降维结果。

convnet3designer的博客 512

MySQL锁,锁的到底是什么?

只要学计算机,「锁」永远是一个绕不过的话题。MySQL锁也是一样。 一句话解释MySQL锁: MySQL锁是解决资源竞争的一种方案。 短短一句话却包含了3点值得我们注意的事情: 对什么资源进行竞争? 竞争的方式(或者说情形)有哪些? 锁是如何解决竞争的? 这篇文章开始带你循序渐进地理解这几个问题。

mf97532的博客 1095

杭电计算机组成原理课程设计-实验七-寄存器堆设计实验

寄存器堆实验实验原理实验内容模块功能说明模块逻辑引脚图寄存器堆模块代码REG模块测试用例REG-ALU测试用例实验结果记录 寄存器堆实验结果及分析ALU_REG运算器模块实验结果及分析探索与思考 实验原理   32×32位的寄存器堆模块示意图如图所示,含有32个寄存器,每个寄存器32位。该寄存器堆具有A和B两个读端口,分别由 5 位的寄存器编号 R_Addr_A 和 R_Addr_B 来寻址 2 个寄存器,读出的数据则由 R_Data_A(32 位)和R_Data_B(32 位)输出。读访问时,没有使能或者

HDU-整蛊小子-⏰☂️/蚂蚁集团研发工程师 1万+

【MySQL】资源分类,锁的分类、死锁的产生原因、避免和解决方法

什么是资源: 系统中有很多资源,在采用互斥性访问并且不可被抢占的资源就叫 临界性资源。 对于资源的分类: 1.根据使用次数分类: (1)可重用性资源: 每一个可重用性资源中的单元都只能被一个进程所使用,不允许多个进程共享。 进程使用资源顺序:a:请求资源(如果请求失败,则会进程堵塞或者循环等待),b:使用资源,c:释放资源 系统中的可重复性...

qq_41321905的博客 507

高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入

一. 第一个重要极限 二. 第二个重要极限 三. 导数定义式 全文见【高等数学】两个重要的极限 - 知乎

"You are worthy! You can do it!" 6万+

[基于STM32底盘控制与ROS上层导航小车制作] 第一节 stm32电机驱动与编码器读取反馈

系列文章目录 第一节stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息 第六节 ROS计算和发布里程计 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 系列文章目录 前言 1.pwm与电机正反转 2.编码器初始化 二、pwm控制与编码器使用 1.pwm使电机 .

LanLanLan1927的博客 1万+

Mysql数据库产生死锁的三种情况与解决办法

数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行。 在数据库...

春风化雨 3246

音视频从入门到精通——指数哥伦布码原理

在计算机中,一般数字的编码都为二进制,但是由于以相等长度来记录不同数字,因此会出现很多的。

mirana的专栏 1383

Mysql中锁的详细讲解

锁是数据库管理系统提供的一种机制,用于控制对数据的访问。在同时执行多个事务时,锁可以防止数据的并发修改。这是确保 ACID 特性(特别是一致性和隔离性)的重要部分。

创作不易,请多支持,将为本站提供更多「有价值的文章」。 810

Vivaldi天线HFSS建模实战:从参数化曲线到辐射优化的完整流程

本文详细介绍了Vivaldi天线在HFSS中的建模与优化全流程,涵盖参数化曲线绘制、馈电系统设计及性能验证等关键步骤。通过实战案例分享,帮助工程师掌握超宽带天线的HFSS建模技巧,提升雷达探测和通信系统设计效率。重点解析了指数渐变曲线建模、微带馈电优化等核心技术要点。

weixin_29228781的博客 277

国内网络环境下Leaflet加载OpenStreetMap地图的5种替代方案(附可用瓦片地址)

本文针对国内网络环境下Leaflet加载OpenStreetMap地图的常见问题,提供了5种可用的瓦片替代方案,包括OpenStreetMap.fr HOT、OpenStreetMap.de、CartoDB、Stamen和Thunderforest,并附上详细的代码示例和选择建议,帮助开发者解决地图加载问题。

qsc901234的博客 1708

Mysql中的三类锁,你知道吗?

导读正所谓有人(锁)的地方就有江湖(事务),人在江湖飘,怎能一无所知?今天不聊江湖,来细说一下Mysql中的三类锁,分别是全局锁、表级锁、行级锁。全局锁全局锁简单的说就是锁住整个数据库...

码猿技术专栏 7867

【并发编程五】c++进程通信——共享内存(shared memmory)

现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A中 和 进程 B中 的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。⽤了共享内存通信⽅式,带来新的问题,那就是如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。那共享内存的⽅式,就很好的解决了这⼀问题。

junxuezheng的博客 1万+

MySQL的锁你知道哪些?

Next-Key Lock 称为临键锁,是 Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。表锁:通过lock tables 语句可以对表加表锁,表锁除了会限制别的线程的读写外,也会限制本线程接下来的读写操作。元数据锁:当我们对数据库表进行操作时,会自动给这个表加上 MDL,对一张表进行 CRUD 操作时,加的是。而且记录锁是有 S 锁和 X 锁之分的,满足读写互斥,写写互斥。,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。

了解➔熟悉➔掌握➔精通 770

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

关于 MySQL 锁 你知道多少

MySQL 锁 是指 同一时间同一资源只能被一个线程访问。而 锁 正是 数据库系统 区别于 文件系统 的一个关键特性,锁机制 用于管理对共享资源的并发访问。 若一个事务(A)已经获取了 记录(R)的共享锁,而另一个事务(B)也可以同时获取 记录(R)的共享锁,这种情况称之为 锁兼容; 若另一个事务(C)想获取 记录(R)的排他锁,则它必须等待事务(A)、事务(B)释放 记录(R)上的共享锁,这种情况称之为 锁不兼容。......

weixin_51123079的博客 536

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

你应该知道的 MySQL 的锁

背景 数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制。MySQL 根据底层存储引擎的不同,锁的支持粒度和实现机制也不同。MyISAM 只支持表锁,InnoDB 支持行锁和表锁。目前 MySQL 默认的存储引擎是 InnoDB,这里主要介绍 InnoDB 的锁。 InnoDB 存储引擎 使用 InnoDB 的两大优点:一是支持事务;二是支持行锁。 MySQL 的事务 ...

weixin_30407613的博客 72

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

面试你应该知道的 MySQL 的锁

背景 数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制。MySQL 根据底层存储引擎的不同,锁的支持粒度和实现机制也不同。MyISAM 只支持表锁,InnoDB 支持行锁和表锁。目前 MySQL 默认的存储引擎是 InnoDB,这里主要介绍 InnoDB 的锁。 InnoDB 存储引擎 使用 InnoDB 的两大优点:一是支持事务;二是支持行锁。 MySQL 的事务 ...

bu2013的博客 551

MySQL 啥时候用表锁,啥时候用行锁?这些你都应该知道吧

文章最后,我们回顾一下开头提出的问题:Innodb 啥时候用表锁,啥时候用行锁?表级锁包括:表锁、元数据锁、意向锁。对于表锁而言,当存储引擎不支持行级锁时,使用表锁。SQL 语句没有匹配到索引时,使用表锁。对于元数据锁而言,对表做增删改查时,会加上 MDL 读锁。对表结构做变更时,会加上 MDL 写锁。对于意向锁而言,对表中的行记录加锁时,会用到意向锁。而对于行级锁而言,增删改查匹配到索引时,会使用行级锁。最后,附上本文的思维导图,方便大家回顾本文内容。文章思维导图。...

m0_62051288的博客 442

关于MySQL的锁,你想知道的全在这里了

在上述示例中,Session 1在事务开始之后使用`SELECT...FOR SHARE`语句对`products`表的`id=1`行加共享锁。在上述示例中,Session 1使用`FOR SHARE`语句获取`products`表中`id`为1的记录的共享锁,用于读取操作。在上述示例中,Session 1在事务开始之后使用`SELECT...FOR UPDATE`语句对`products`表的`id=1`行加排它锁。在事务执行期间,其他事务可以获取相同数据页的共享锁,但无法获取排他锁。

a2500100455的专栏 260

mysql三锁_Mysql中的三类锁,你知道吗?

点击上方“码农沉思录”,选择“设为星标”优质文章,及时送达导读正所谓有人(锁)的地方就有江湖(事务),人在江湖飘,怎能一无所知?今天不聊江湖,来细说一下Mysql中的三类锁,分别是全局锁、表级锁、行级锁。全局锁全局锁简单的说就是锁住整个数据库实例,命令是Flush tables with read lock 。当你需要为整个数据库处于只读的状态的时候,可以使用这个命令。一旦使用全局锁,之后其他线程...

weixin_39597318的博客 210

MySql 索引、锁、事务,你必须知道的点

1. 索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容。 索引的优点:1. 天生排序。2. 快速查找。 索引的缺点:1. 占用空间。2. 降低更新表的速度。 注意点:小表使用全表扫描更快,中大表才使用索引。超级大表索引基本无效。 索引从实现上说,分成 2 种:聚集索引和辅助索引(也叫二级索引或者非聚集索引) 从功能上说,分为 6 种:普通索引,唯一索引,主键索引,复合索引,外键索引,全文索引。 详细说说 6 种索引: 1、普通索引:最基本的索引,没有任何约束。 2、唯一索引:与普通索引类

doubututou的博客 181

for update什么时候释放锁_Mysql中的三类锁,你知道吗?

导读正所谓有人(锁)的地方就有江湖(事务),人在江湖飘,怎能一无所知?今天来细说一下Mysql中的三类锁,分别是全局锁、表级锁、行级锁。全局锁全局锁简单的说就是锁住整个数据库实例,命令是Flush tables with read lock。当你需要为整个数据库处于只读的状态的时候,可以使用这个命令。一旦使用全局锁,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建...

weixin_39637059的博客 2085

超详细的Mysql锁 实战分析,你想知道的都在这里~

1.mysql回表查询 在这里提起主要是用于说明mysql数据和索引的结构,有助于理解后续加锁过程中的一些问题。 mysql索引结构和表数据结构是相互独立的,根据索引查询,只能找到索引列和主键聚簇索引。如果select语句中不包含索引列,mysql会根据主键聚簇索引二次回表查询所需要的数据,查询出来的数据是根据聚簇索引排序的。如果select中只包含索引列和聚簇索引,那么mysql不会再根据聚簇...

一枝花算不算浪漫的专栏 1326

mysql 转int_面试你应该知道的 MySQL 的锁

部分面试资料链接:https://pan.baidu.com/s/1qDb2YoCopCHoQXH15jiLhA密码:jsam想获得全部面试必看资料,关注公众号,大家可以在公众号后台回复“知乎”即可。背景数据库的锁是在多线程高并发的情况下用来保证数据稳定性和一致性的一种机制。MySQL 根据底层存储引擎的不同,锁的支持粒度和实现机制也不同。MyISAM 只支持表锁,InnoDB 支持行锁和表锁。目...

weixin_39969448的博客 61
上一篇: 你知道在Java 中常被提的 SPI 到底是什么吗?
下一篇: MySQL存在这么多的数据引擎 , 所有的引擎都在使用吗
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值