MySQL【05】锁机制:共享锁、排他锁、意向锁

本文将以实验为主,演示共享锁、排他锁的特性,演示行锁升级为表锁。
为进行实验,先建立account表,含有一个主键id

CREATE TABLE account (
    id INT (11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) DEFAULT NULL,
    balance INT DEFAULT 0,
    PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

INSERT INTO account (name, balance) VALUES ('li', 10);
INSERT INTO account (name, balance) VALUES ('ha', 233);
account表

1、共享锁、也叫读锁、S锁

读锁是共享的,或者说是互相不阻塞的,多个客户在同一时刻可以同时读取同一资源,而互不干扰。
若 事务T 对数据 对象A 加上 S锁 ,其他事务可以对 A 加 S锁 ,但不能加 X锁 ,直到 T 释放 A 上的 S锁。
S锁保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
加读锁:普通的select语句不会加任何锁,加读锁需要显示的加上【LOCK IN SHARE MODE】。
下面通过例子展示读锁的特点。

步骤 会话 A命令 balance值 会话 B命令 balance值
1 BEGIN;
2 select balance from account where id = 1 LOCK IN SHARE MODE; 10
3 select balance from account where id = 1 LOCK IN SHARE MODE; 10
4 update account set balance = 666 where id = 1; 将会被阻塞
5 COMMIT; update执行

可以发现会话A 对id=1行加读锁之后,会话B任然可以对id=1行加读锁,但是会话B继续对id=1行执行更新操作将会被阻塞。
如果在第5步不是提交事务,而是执行一个更新语句的话,update account set balance = 777 where id = 1,这时候将会发生死锁现象。

2、排他锁、也叫写锁、X锁

写锁是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑。
事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。
X锁保证了其他事务在T释放A上的锁之前不能再读取和修改A。

1、自动加锁: delete / update / insert 语句会自动加上排他锁;
2、手动加排它锁:select * from student where id=1 FOR UPDATE;

步骤 会话 A命令 balance值 会话 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where id = 1;
3 select balance from account where id = 1; 10
4 select balance from accountwhere id = 2 LOCK IN SHARE MODE; 不阻塞233
4 select balance from account where id = 1 LOCK IN SHARE MODE; 阻塞
5 COMMIT; 结果出来0

可以发现, update 语句中 where 条件为主键时,是对该行上锁,其他会话想获取该行的读或写锁都将被阻塞,但是其他行不受影响。

3、为什么推荐 MySQL 的 update 语句中 where 条件要有主键索引、唯一索引?

接下来演示一下如果update 语句中 where 条件是没有索引的name字段会怎么样呢。
将会发现,由于name字段没有索引,所以对该行的行锁升级为了表锁,其他行想获取读锁或写锁都将被阻塞。

步骤 会话 A命令 balance值 会话 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where name = 'li';
3 select balance from account where id = 1; 10
4 select balance from account where id = 2 LOCK IN SHARE MODE; 阻塞
5 Ctrl-c
6 select balance from account where id = 1 LOCK IN SHARE MODE; 阻塞

现在对name 字段新增唯一索引 https://www.cnblogs.com/ShareJia/p/10008110.html

增加唯一索引:CREATE UNIQUE INDEX index_name ON account (NAME);
删除指定索引:DROP INDEX NAME ON account;
查询索引:SHOW INDEX FROM account;
步骤 会话 A命令 balance值 会话 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where name = 'li';
3 select balance from account where id = 1; 10
4 select balance from account where id = 2 LOCK IN SHARE MODE; 10
6 select balance from accountwhere id = 1 LOCK IN SHARE MODE; 阻塞

会发现,对name 字段添加索引后,仅name为'li'的这一行上了锁。

原理简析:

推荐阅读:
MySQL InnoDB锁原理剖析
如何书写 update 避免表锁
InnoDB行锁是通过给索引上的索引项加锁来实现的。所以,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

4、意向锁

Inno存储引擎支持意向共享锁,意向锁为表级别的锁。设计的主要目的是为了在一个事务中揭示下一行将被请求的锁类型。其支持两种意向锁。
1、意向共享锁 IS
2、意向排他锁 IX
意向锁可以优化锁之间的性能。

B站学习视频
相关问题:
为什么表没有索引,表里所有的记录都会被锁住
update age from user无索引是行锁还是表锁,为什么

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