记录一下MySql update会锁定哪些范围的数据
来源:SegmentFault
时间:2023-02-16 15:24:45 209浏览 收藏
在数据库实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《记录一下MySql update会锁定哪些范围的数据》,聊聊MySQL、锁、Java、数据库、lock,希望可以帮助到正在努力赚钱的你。
1、背景
在项目中,我们经常使用到
mysql> show variables like 'transaction_isolation'; +-----------------------+-----------------+ | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec)
2.2 数据库版本
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.28 | +-----------+ 1 row in set (0.00 sec)
2.3 数据库的存储引擎
mysql> show variables like '%storage_engine%'; +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+ 4 rows in set (0.01 sec)
2.4 锁是加在记录上还是索引上
create table test_record_lock ( id int not null comment '主键', age int null comment '年龄,普通索引', name varchar(10) null comment '姓名,无索引', constraint test_record_lock_pk primary key (id) ) comment '测试记录锁'; create index test_record_lock_age_index on test_record_lock (age);
2.6.5 表中的测试数据
mysql> select * from test_record_lock; +----+------+--------+ | id | age | name | +----+------+--------+ | 1 | 10 | 张三 | | 5 | 20 | 李四 | | 8 | 25 | 王五 | +----+------+--------+ 3 rows in set (0.00 sec)
2.7 查看数据库中当前的锁
mysql> begin; Query OK, 0 rows affected (0.01 sec) mysql> update test_record_lock set name = 'aaa' where id >= 1; Query OK, 3 rows affected (0.00 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> select LOCK_TYPE,INDEX_NAME,LOCK_MODE,LOCK_DATA from performance_schema.data_locks; +-----------+------------+---------------+------------------------+ | LOCK_TYPE | INDEX_NAME | LOCK_MODE | LOCK_DATA | +-----------+------------+---------------+------------------------+ | TABLE | NULL | IX | NULL | | RECORD | PRIMARY | X,REC_NOT_GAP | 1 | | RECORD | PRIMARY | X | supremum pseudo-record | | RECORD | PRIMARY | X | 8 | | RECORD | PRIMARY | X | 5 | +-----------+------------+---------------+------------------------+ 5 rows in set (0.01 sec)
此时只可向表中插入比最小临界值小的记录。
3、正常范围
3.2 普通索引测试
3.2.1 等值更新-记录存在
解释:
- 先对普通索引
age
加上next-key lock,锁定的范围是(10,20] - next-key lock还会锁住本记录,因此在id索引的值等于5上加了Record Lock
- 因为是普通索引并且值还存在,因此还会对本记录的下一个区间增加间隙锁 Gap Lock,锁定的范围为 (20,25)
3.2.2 等值更新-记录不存在
解释:
- 获取next-key lock 锁定的范围为 (10,20]
- 因为需要更新的记录不存在,next-key lock退化成 gap lock,所以锁定的范围为(10,20)
- 因为是普通索引且记录不存在,所以不需要再次查找下一个区间。
3.2.3 范围更新
解释:
- 普通索引的范围更新,next-key-lock不回退化成 gap lock。
3.3 无索引更新
从上图中可知,无索引更新数据表危险,需要谨慎处理。无索引更新,会导致全表扫描,导致将扫描到的所有记录都加上
next-key lock。
3、参考链接
1、https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html#innodb-intention-locks
2、https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html
今天关于《记录一下MySql update会锁定哪些范围的数据》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!
声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
499 收藏
-
244 收藏
-
235 收藏
-
157 收藏
-
101 收藏
最新阅读
更多>
-
214 收藏
-
155 收藏
-
485 收藏
-
436 收藏
-
125 收藏
-
174 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
评论列表
-
- 天真的柚子
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术贴!
- 2023-04-16 18:27:16
-
- 开朗的镜子
- 这篇技术贴真是及时雨啊,太详细了,很有用,mark,关注博主了!希望博主能多写数据库相关的文章。
- 2023-03-18 14:29:58
-
- 寂寞的外套
- 好细啊,码起来,感谢师傅的这篇技术文章,我会继续支持!
- 2023-03-10 16:44:11
-
- 殷勤的老师
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢博主分享博文!
- 2023-02-23 21:32:36
-
- 怕黑的月亮
- 这篇文章内容出现的刚刚好,太全面了,太给力了,码住,关注作者了!希望作者能多写数据库相关的文章。
- 2023-02-22 21:19:39
-
- 苹果月饼
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者分享文章!
- 2023-02-20 22:05:04
-
- 明亮的康乃馨
- 很详细,已收藏,感谢作者大大的这篇博文,我会继续支持!
- 2023-02-19 20:07:39
-
- 重要的鲜花
- 很详细,已加入收藏夹了,感谢作者大大的这篇技术文章,我会继续支持!
- 2023-02-19 16:54:03
-
- 怕黑的月亮
- 这篇文章出现的刚刚好,很详细,写的不错,收藏了,关注老哥了!希望老哥能多写数据库相关的文章。
- 2023-02-19 05:01:16
-
- 虚幻的汉堡
- 这篇文章真是及时雨啊,楼主加油!
- 2023-02-18 19:10:16
-
- 坚定的网络
- 受益颇多,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享技术文章!
- 2023-02-17 17:43:04
-
- 生动的毛豆
- 这篇技术文章真是及时雨啊,太细致了,受益颇多,已加入收藏夹了,关注博主了!希望博主能多写数据库相关的文章。
- 2023-02-17 15:33:19