SQL语句的加锁方式 - Mysql 锁机制
创始人
2024-05-29 21:35:09
0

SQL语句的加锁方式 - Mysql锁机制
SELECT ... FROM
SELECT ... FOR UPDATE / SELECT ... FOR SHARED MODE
SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE
UPDATE ... WHERE ...
DELETE FROM ... WHERE ...
INSERT
INSERT ... ON DUPLICATE KEY UPDATE
REPLACE
Mysql锁机制中SQL语句的加锁方式
MySQL加锁读、更新、删除操作通常会给处理过程中扫描到的行添加记录锁,不管语句中是否存在排除该行的where条件。InnoDB不知道具体的WHERE条件是什么,而只清楚扫描了哪些索引范围。加锁通常是临界锁,会阻塞行数据前间隙的插入。

如果在搜索中使用了二级索引,并且要设置的索引记录锁是排他的,InnoDB也会检索相应的聚类索引记录并对其设置锁

如果你的语句不能使用合适的索引,MySQL不得不进行全表扫描,导致所有的行都会被锁住。那么其他的所有插入语句将被阻塞。因此给你的查询语句加上合适的锁是非常重要的

InnoDB的加锁方式如下:

SELECT … FROM
SELECT ... FROM是一致性读,读取数据库的快照并不加任何锁(除非是“串行化”的隔离级别)。

SELECT … FOR UPDATE / SELECT … FOR SHARED MODE
SELECT ... FOR UPDATE or SELECT ... FOR SHARED MODE对扫描的行获取锁,并期望对不符合包含在结果集中条件的行释放锁(例如,如果它们不满足WHERE子句中给定的条件)。但是,在某些情况下,可能不会立即解锁行,因为在查询执行期间会丢失结果行与其原始源之间的关系。例如,在UNION中,从表中扫描(和锁定)的行可能会在评估它们是否符合结果集之前插入临时表。

SELECT … LOCK IN SHARE MODE
SELECT ... LOCK IN SHARE MODE给扫描到的所有行添加共享临界锁。但是,对于使用唯一索引,并搜索唯一行的语句,只需要添加索引记录锁

SELECT … FOR UPDATE
SELECT ... FOR UPDATE给扫描到的所有行添加排它临界锁。但是,对于使用唯一索引,并搜索唯一行的语句,只需要添加索引记录锁

UPDATE … WHERE …
UPDATE ... WHERE ...给扫描到的所有行添加排它临界锁。但是,对于使用唯一索引,并搜索唯一行的语句,只需要添加索引记录锁

当update语句修改了聚簇索引的行,其关联的二级索引也会被添加隐式锁。在二级索引插入新数据前进行重复数据校验、和插入新数据时,update操作同样会给相关的二级索引添加共享锁

DELETE FROM … WHERE …
DELETE FROM ... WHERE ....给扫描到的所有行添加排它临界锁。但是,对于使用唯一索引,并搜索唯一行的语句,只需要添加索引记录锁

INSERT
INSERT在插入的行上插入排它锁,该锁仅是索引记录锁,非临界锁(即不锁住间隙),不会阻止其他会话在该行前的间隙插入行

在插入行之前,InnoDB会设置插入意向锁。该锁表示要以这样一种方式插入,即插入到同一索引间隙的多个事务如果不在间隙内的同一位置插入,则不需要相互等待。假设有值为4和7的索引记录。尝试插入值5和6的独立事务在获得插入行上的排它锁之前,每个事务都用插入意图锁锁定4和7之间的间隙,但不会阻塞彼此,因为行是不冲突的

如果出现重复键错误(duplicate-key error),则对重复索引记录添加共享锁(shared lock)。 如果有多个会话试图插入同一行,而另一个会话已经拥有独占锁,那么使用共享锁可能会导致死锁。如果另一个会话删除了该行,就会发生这种情况。假设有一个表t1:

CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;

有三个会话分别执行插入语句:

Session1: START TRANSACTION;
INSERT INTO t1 VALUES(1);Session2: START TRANSACTION;
INSERT INTO t1 VALUES(1);Session3: START TRANSACTION;
INSERT INTO t1 VALUES(1);

此时会话1回滚:

Session1:
ROLLBACK;

会话1的第一个操作为行获取排他锁。会话2和会话3的操作都导致重复密钥错误,它们都请求行共享锁。当会话1回滚时,它释放对该行的排他锁,并为会话2和会话3授予排队的共享锁请求。此时,会话2和会话3会死锁:由于另一方持有共享锁,任何一方都不能获得行独占锁

INSERT … ON DUPLICATE KEY UPDATE
INSERT ... ON DUPLICATE KEY UPDATE与简单INSERT的不同之处在于,当重复键错误发生时,将排他锁而不是共享锁放在要更新的行上。对重复的主键值使用排他索引记录锁。如果是重复主键索引,加排它记录锁;如果是重复唯一键索引,加排它临界锁

REPLACE
REPLACE在没有唯一键冲突的情况下,表现和INSERT相同。如果有唯一键冲突,则在被替换的行上添加排它临界锁。

上一篇:Spark DPP

下一篇:数列的极限

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...