面试被问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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
mysql 8.0.24 安装配置方法图文教程
May 12 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL数据库必备之条件查询语句
Oct 15 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
Mysql如何查看是否使用到索引
Dec 24 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
杏林同学录(一)
2006/10/09 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
动态加载js的几种方法
2006/10/23 Javascript
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
2010/11/23 Javascript
为JS扩展Array.prototype.indexOf引发的问题探讨及解决
2013/04/24 Javascript
javascript实现复制与粘贴操作实例
2014/10/16 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
Javascript 模拟mvc实现点餐程序案例详解
2020/12/24 Javascript
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
Python异常处理总结
2014/08/15 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
Python实现基于权重的随机数2种方法
2015/04/28 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
给老师的一封建议书
2014/03/13 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
一年级小学生评语
2014/04/22 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
求职自荐信怎么写
2015/03/04 职场文书
企业员工辞职信范文
2015/05/12 职场文书
开学第一周总结
2015/07/16 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
Redis唯一ID生成器的实现
2022/07/07 Redis