行锁

mysql 中 innodb 存储引擎支持行锁,我们平常默认使用的也是innodb存储引擎,因为innodb 引擎中有mvcc 的控制,所以我们要想测试的时候就需要手动来显示加锁

  • 共享锁  select  ....  lock  in  share mode
  • 排他锁  select  ... for update  insert  update  delete

演示

有以下表

+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
|  4 | ccc  | 2    |
|  7 | 1    | 4    |
| 10 | fff  | 6    |
+----+------+------+

其中id 为自增主键

开启两个客户端,设置事务手动提交

客户端1 客户端2

mysql> 
mysql> 
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> 
mysql> 
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> select *from student where id = 1 lock in share mode;
+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
+----+------+------+
1 row in set (0.00 sec)

mysql>

mysql> select *from student where id = 1 lock in share mode;
+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
+----+------+------+
1 row in set (0.00 sec)

mysql>

select *from student where id =1 for update ;

(被阻塞)

mysql> commit;
Query OK, 0 rows affected (0.01 sec)
 
mysql> select *from student where id =1 for update ;
+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
+----+------+------+
1 row in set (0.00 sec)
 

由上表我们可以得出,共享锁可以多个客户端获取,当客户端1要获取排他锁的时候,因为客户端2事务没有提交,依然占有共享锁,所以客户端1被阻塞,直至客户端2事务提交,同样排他锁的获取也是独占的

间隙锁

+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
|  4 | ccc  | 2    |
|  7 | 1    | 4    |
| 10 | fff  | 6    |
+----+------+------+

客户端1         客户端2

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> select *from student where id >20 for update ;
Empty set (0.00 sec)
 

mysql> 
mysql> insert into student values(11,'x','x');

(被阻塞)

commit;
插入成功

客户端1加排他锁来查询大于20的记录,客户端2在插入11的时候会被阻塞,这是因为,客户端1在查询的时候会对记录加间隙锁,我们当前表的间隙有 (负无穷,1),(1,4),(4,7),(7,10),(10,正无穷),当我们执行 select *from student where id >20 for update ;的时候就会对 (10,正无穷)加锁,所以客户端2会被阻塞,但是这里的10是开区间,也就是说如果客户端2对10进行修改是不会阻塞的。同样如果我们执行 select *from student where id >7 and id <10 for update ; 就会对(7,10)加间隙锁,这里的间隙锁都是没有加在记录上,如果加在了记录上就会变成临键锁,即行锁加间隙锁

临键锁

+----+------+------+
| id | name | addr |
+----+------+------+
|  1 | xxx  | 1    |
|  4 | ccc  | 2    |
|  7 | 1    | 4    |
| 10 | fff  | 6    |
+----+------+------+

客户端1         客户端2
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select *from student where id >4 and id <10 for update;
+----+------+------+
| id | name | addr |
+----+------+------+
|  7 | 1    | 4    |
+----+------+------+
1 row in set (0.00 sec)
mysql> insert into student values(8,'x','x');
(被阻塞)

客户端1执行select *from student where id >4 and id <10 for update;会对(4,7】,(7,10】加锁,即 7和10 也会被锁住,即间隙(4,7),(7,10)和 行锁 7 和10;但是对4进行修改将不会阻塞

注意

上述的所有操作都是基于索引的,如果不通过索引加锁的话,锁就会升级为表锁,索引失效也会升级为表锁,其次在演示的时候所有的操作都显示的加锁,因为mvcc机制,不显示加锁的话会产生快照读

Mysql 行锁 间隙锁 临键锁相关推荐

  1. MySQL中的各种锁(行锁、间隙锁、临键锁等等LBCC)

    目录 1.快照读和锁定读 1.1 一致性读 / 快照读 1.2 锁定读 1.2.1 共享锁和独占锁 1.2.2 锁定读的语句 1.2.2.1 Lock In Share Mode 对记录加S共享锁 1 ...

  2. Mysql里的锁(排它锁、共享锁、行锁、表锁、间隙锁、临键锁、意向锁)

    一.加锁的目的是什么? 在我们了解数据库锁之前,首先我们必须要明白加锁的目的是为了解决什么问题,如果你还不清楚的话,那么从现在起你应该知道,数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影 ...

  3. MySQL的锁机制 - 记录锁、间隙锁、临键锁

    记录锁(Record Locks) 记录锁是 封锁记录,记录锁也叫行锁,例如: SELECT * FROM `test` WHERE `id`=1 FOR UPDATE; 它会在 id=1 的记录上加 ...

  4. 5.MySQL行锁、表锁、间隙锁详解

    一.表锁 表锁不依赖于储存引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),开销小(因为力度大).表锁不会产生死锁问题,但是表锁会影响并发率.  表锁不依赖索引,当索引失效的时候,行 ...

  5. MySQL(七)关于MySQL不同版本下临键锁锁定范围不同

    MySQL InnoDB底层的锁实现算法分为三种 : 记录锁,间隙锁,临键锁. 之前在验证MySQL的临键锁的时候使用docker安装的最新版本的MySQL镜像,发现其临键锁在最新的MySQL的表现和 ...

  6. MySQL数据库InnoDB存储引擎中的锁机制--转载

    原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化 ...

  7. MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍

    MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性 ...

  8. mysql innodb 的锁机制_Mysql之Innodb锁机制详解

    InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.关于事务我们之前有专题介绍,这里就着重介绍下它的锁机制. 总的来说,InnoDB按照不同的分类共有 ...

  9. mysql 锁 代码_MySQL中的锁实例

    表结构: id:自增主键,a:无索引,b:普通索引 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(4) NOT ...

  10. mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)

    1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...

最新文章

  1. 失败原因_解析干洗店失败原因
  2. 第三篇:时间和全局状态(三)
  3. sql之left join、right join、inner join的区别,连接自己时的查询结果测试
  4. 高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水
  5. mysql 8.0 手动安装教程_mysql 8.0.13手动安装教程
  6. 1218 溢出设置 overflow
  7. 计算机组成原理—浮点数
  8. 【转】 Android xml中 @和?区别,style和attr小结
  9. 电脑芯片和服务器芯片,王思聪的服务器和我们的电脑有什么区别?
  10. 最新诺顿病毒库报暴风影音7.0有毒![原]
  11. python新浪_Python——新浪新闻抓取
  12. Windows Server 2016安装SCCM2019
  13. 基于闪存存储原理的U盘数据安全测试和U盘数据保护软件
  14. 2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 写一个函数来计算范围在 [low, high] 之间中心对称数的个
  15. 通用图床服务架构解析(百万级回源/天)
  16. NBOOT分析-S3C244xInit.s(1)
  17. 解决笔记本IPS屏幕发黄问题
  18. 买眼镜踩坑【吐槽一下实体店的坑】
  19. 如何在eclipse创建maven工程
  20. 16秋计算机与技术鲁嘉华第一章作业

热门文章

  1. 如何克隆硬盘/分区?
  2. 即付宝服务器无响应,即付宝蓝牙配对不成功,即付宝苹果蓝牙连不上
  3. B站价值60亿跨年晚会背后的微服务治理
  4. eclipse引入jquery不起作用
  5. matlab 三维 作图 坐标轴_怎么设置三维图的坐标轴在任意位置
  6. php xp不支持,通达OA 11版客户端不支持XP系统升级后无法使用的解决方案
  7. 【Linux】backlog是什么?
  8. 自建dns过滤器,过滤广告信息
  9. iOS7.1以及iOS9.2与之前的不同
  10. SAP之FPM卷七:FPM开发实例-完成主页面功能(通过EXCEL上载数据)