mysql 行锁 表锁 间隙锁

本文章环境 : 

mysql8.0

隔离级别 : 读已提交

关闭自动提交


创建edu表 : 

CREATE TABLE IF NOT EXISTS `edu`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `name` VARCHAR(100) NOT NULL,
   `age` INT NOT NULL,
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `edu` ADD INDEX index_name ( `age` );


INSERT INTO edu(name,age) values("张三",18);
INSERT INTO edu(name,age) values("李四",20);
INSERT INTO edu(name,age) values("王五",21);
INSERT INTO edu(name,age) values("赵六",22);
INSERT INTO edu(name,age) values("田七",23);
INSERT INTO edu(name,age) values("老八",26);
INSERT INTO edu(name,age) values("老九",30);
INSERT INTO edu(name,age) values("老十",31);
INSERT INTO edu(name,age) values("十一",35);
INSERT INTO edu(name,age) values("十二",38);

 

一 : 行锁

当开启事务时, 对数据库中的数据进行上锁查询, 主要分为两种情况

  • 查询条件为索引字段
  • 查询条件为非索引字段

当查询条件为索引字段时, 是对这条数据上行锁, 当查询条件为非索引字段时, 行锁就会升级为表锁

1. 对索引字段进行查询

 id字段是主键索引, 当对id字段进行上锁查询时, 只对id = 1这一行数据进行上锁, 当开启一个新的事务查询id = 2时, 不会进行阻塞, 但是对id = 1查询时就会进行阻塞

2. 对非索引字段进行查询

 name字段为非索引字段, 当对name="张三"进行上锁查询时, 上的应该是行锁, 所以当对name="李四"进行查询时, 发生了阻塞

二 间隙锁

具体请看这篇 : https://www.jianshu.com/p/bf862c37c4c9

https://blog.csdn.net/qq_40378034/article/details/90904573

1. 对索引字段

 

 当对age = 20这条数据进行查询时, 间隙锁的区间为[18,21), 所以18, 19 插入不进去, 21可以插入

2. 对非索引字段

 锁全表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值