mysql主流锁体系回顾

mysql主流锁.png

1. 锁相关解释

1.1 行级锁定义

记录锁(Record Lock)

  • 锁是加在索引上而非数据行上,会阻塞其他事务对该索引行的插入、更新、删除;
  • 仅仅锁住索引记录的一行,在单体索引记录上加锁;
  • 可以加在聚簇索引或者二级索引上;

间隙锁(Gap Lock)

  • 间隙锁是对索引记录之间的间隙的锁,或者是对第一个索引记录之前或最后一个索引记录之后的间隙的锁,目标就是为了防止其他事务在这个区间插入数据;
  • 间隙锁前开后开区间:(-无穷,a)(a,b)(b,+无穷)
  • 间隙锁之间是兼容的,即多个事务可以在同一个间隙上获取间隙锁;
  • 间隙锁在RR(可重复读)级别以上才使用;

临键锁(Next-Key Lock)

  • 临键锁是Record(记录)锁+Gap(间隙)锁的组合,对索引项以及索引项之间的间隙加锁,前开后闭区间(a,b]。
  • 默认情况下,InnoDB使用Next-Key Lock。

插入意向锁(Insert Intention Lock)

  • 插入意向锁并不是意向锁而是一种特殊的间隙锁,实际是在Gap锁上在了一个Lock_INSERT_INTENTION的标记
  • 执行insert语句前会向插入的间隙加Insert Intention Lock。
  • 插入意向锁之间不冲突,因此允许同时向一个间隙插入不同的主键数据

1.2 加锁情况分析

select * from user where uid=xx for update
索引类型 where语句条件能否匹配到数据 加速情况
uid是唯一索引 排他记录锁
uid是唯一索引 间隙锁
uid是普通索引 临键锁
uid是普通索引 间隙锁
uid是不是索引 不管是否匹配 表锁

1.3 表级锁定义

意向锁

首先,申请意向锁的动作是数据库完成的,也就是说,事务A申请一行行锁的时候,数据库会自动先开始申请表的意向锁。

那么到底意向锁有什么用?

首先,意向锁是——表级锁。
(1)事务A锁住了表中的一行,这一行只能读,不能写。【事务A加了共享锁】
(2)事务B申请整个表的写锁。【请注意:是整个表!!!】
(3)如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的共享锁时冲突的。【事务A不允许修改】
(4)数据库为避免这种冲突,怎么办的?就是让B的申请阻塞,直到A释放行锁。
解决方案:
step1:判断表是否已被其他事务用表锁锁住。
step2:判断表中每一行是否已经被行锁锁住。

请注意step2,需要遍历整个表。效率实在不高。
改进版:
step1:不变
step2:发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞。

image

假如一个表被加了意向排他锁(IX),证明此时有事务在修改表中具体某行的数据,那么对应的某行可能加了x锁,1.如果这时候其他事务要再加意向锁,那么可以加成功(因为加了意向锁之后,后续查询或者修改的是某行的数据,这行和上面的x锁未必冲突)所以意向锁之间是兼容的。2.如果此时其他事务加的是全表共享锁S,因为前面表中的数据正在被修改,所以S锁是加不成功的。所以意向排他锁和表共享锁是冲突的。

(敲黑板,划重点)意向锁的作用就是协调行锁和表锁之间的关系的,是将行锁从另一个角度提高到了表锁的等级(伪表锁),与表锁进行判断。
注意:select语句不是加锁!!!

意向锁是InnDB自动加的,不需要用户的干预。

2. 死锁情况

2.1 间隙锁导致思死锁

表中数据uid(1001,1110,1111,1120,1121,1130)。uid是我们的唯一索引。

核心问题:间隙锁是可兼容的,即同一个事务可以在同一个间隙上获取间隙锁。

时刻 事务1 事务2
T1 begin begin
T2 select * from user where uid =1002 for update uid是唯一索引,因此会加上间隙锁(1001,1110)
T3 select * from user where uid =1003 for update uid是唯一索引,因此会加上间隙锁(1001,1110)
T4 insert into user (uid,name,age) values (1002,'tom',12) 此时需要获取插入意向锁,发现1002已经被事务2持有的间隙锁给占了,事务1被阻塞
T5 insert into user (uid,name,age) values (1003,'jackson',13) 此时需要获取插入意向锁,发现1003已经被事务1持有的间隙锁给占了,事务2被阻塞
T6 commit commit

附录

MySql性能(2)— 一文了解所有的mysql隔离级别
MySQL系列-仅靠MVCC就能解决幻读?错!Gap锁了解一下?
MySql性能(4)-mysql锁知多少(表/行锁、共享读锁/独占写锁、共享锁/排他锁、间隙锁、意念锁)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容