面试被问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死锁和分库分表问题详解
Apr 16 MySQL
Mysql基础知识点汇总
May 26 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 MySQL
mysql 获取时间方式
Mar 20 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL数据库事务的四大特性
Apr 20 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL 原理与优化之原数据锁的应用
Aug 14 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
Yii框架form表单用法实例
2014/12/04 PHP
php将金额数字转化为中文大写
2015/07/09 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
JS针对浏览器窗口关闭事件的监听方法集锦
2016/06/24 Javascript
js正则表达式最长匹配(贪婪匹配)和最短匹配(懒惰匹配)用法分析
2016/12/27 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python实现信用卡系统(支持购物、转账、存取钱)
2016/06/24 Python
Python制作动态字符图的实例
2019/01/27 Python
Python3 log10()函数简单用法
2019/02/19 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
python提取log文件内容并画出图表
2019/07/08 Python
python实现canny边缘检测
2020/09/14 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
CSS3中的content属性使用示例
2015/07/20 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
数控技术专科生自我评价
2014/01/08 职场文书
校园公益广告语
2014/03/13 职场文书
毕业自我鉴定书
2014/03/24 职场文书
生日寄语大全
2014/04/08 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
2014中学教师节广播稿
2014/09/10 职场文书
团委副书记工作总结
2015/08/14 职场文书