面试被问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的join buffer原理
Apr 29 MySQL
MySQL表字段时间设置默认值
May 13 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
浅谈MySQL函数
Oct 05 MySQL
Mysql分库分表之后主键处理的几种方法
Feb 15 MySQL
解析MySQL索引的作用
Mar 03 MySQL
Mysql多层子查询示例代码(收藏夹案例)
Mar 31 MySQL
详解Mysql事务并发(脏读、不可重复读、幻读)
Apr 29 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
MySQL实现字段分割一行转多行的示例代码
Jul 07 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
用PHP读取超大文件的实例代码
2012/04/01 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
PHP实现微信公众号验证Token的示例代码
2019/12/16 PHP
防止网站内容被拷贝的一些方法与优缺点好处与坏处分析
2007/11/30 Javascript
Javascript JSQL,SQL无处不在,
2010/05/05 Javascript
JS分页效果示例
2013/10/11 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
extjs 分页使用jsp传递数据示例
2014/07/29 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
用Angular实现一个扫雷的游戏示例
2020/05/15 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
python 中的列表解析和生成表达式
2011/03/10 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
重构Python代码的六个实例
2020/11/25 Python
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
JNI的定义
2012/11/25 面试题
汽车队司机先进事迹材料
2014/02/01 职场文书
2015年新教师工作总结
2015/04/28 职场文书
导游词之山东八仙过海景区
2019/11/11 职场文书