面试被问select......for update会锁表还是锁行


Posted in MySQL onNovember 11, 2021

select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁。

那么它加的是行锁还是表锁,这就要看是不是用了索引/主键。

没用索引/主键的话就是表锁,否则就是是行锁。

验证:

建表sql

//id为主键  
//name 为唯一索引
CREATE TABLE `user` (
	`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR ( 255 ) DEFAULT NULL,
	`age` INT ( 11 ) DEFAULT NULL,
    `code` VARCHAR ( 255 ) DEFAULT NULL,
	PRIMARY KEY ( `id` ),
    KEY `idx_age` ( `age` ) USING BTREE 
) ENGINE = INNODB AUTO_INCREMENT = 1570068 DEFAULT CHARSET = utf8

需要关闭自动提交,通过set @@autocommit=0;   设置为手动提交。0代表手动提交,1代表自动提交。

面试被问select......for update会锁表还是锁行

结合一下实例验证 

实例1:

 使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。

 图一为第一个事务,并且没有提交事务

 图二为第二个事务,去更新数据,被阻塞了

 图三为第二个事务,长时间拿不到锁报错。

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

实例2:

我们在开启一个事务对另一条id为2的数据进行更新,

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

实例3(索引):

 一开始的创建表就age创建了唯一索引。

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

实例4:

 使用普通的字段code去操作

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。

面试被问select......for update会锁表还是锁行

面试被问select......for update会锁表还是锁行

结果:

如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。

如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。

到此这篇关于面试被问select......for update会锁表还是锁行的文章就介绍到这了,更多相关select for update 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql 如何查询时间段交集
Jun 08 MySQL
新手入门Mysql--概念
Jun 18 MySQL
记一次Mysql不走日期字段索引的原因小结
Oct 24 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL创建管理RANGE分区
Apr 13 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
MySQL新手入门进阶语句汇总
Sep 23 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
C#静态方法与非静态方法实例分析
2014/09/22 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
php变量与JS变量实现不通过跳转直接交互的方法
2017/08/25 PHP
详解php用static方法的原因
2018/09/12 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
JavaScript中的this实例分析
2011/04/28 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
JavaScript实现向右伸出的多级网页菜单效果
2015/08/25 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
JS实现图片剪裁并预览效果
2016/08/12 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
JavaScript生成.xls文件的代码
2016/12/22 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
2017/10/12 Javascript
jQuery实现的简单前端搜索功能示例
2017/10/28 jQuery
react-native android状态栏的实现
2018/06/15 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
详解vuex之store拆分即多模块状态管理(modules)篇
2018/11/13 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
jQuery中实现text()的方法
2019/04/04 jQuery
Vue3.0数据响应式原理详解
2019/10/09 Javascript
部署vue+Springboot前后端分离项目的步骤实现
2020/05/31 Javascript
[01:32]2016国际邀请赛中国区预选赛IG战队首日赛后采访
2016/06/27 DOTA
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
2014/01/23 Python
python使用win32com在百度空间插入html元素示例
2014/02/20 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
python怎么调用自己的函数
2020/07/01 Python
美国家居装饰店:Pier 1
2019/09/04 全球购物
还款承诺书范文
2014/05/20 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
文化大革命观后感
2015/06/17 职场文书
祝福语集锦:送给毕业同学祝福语
2019/11/21 职场文书
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL