面试被问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 相关文章推荐
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
MySQL 自定义变量的概念及特点
May 13 MySQL
mysql升级到5.7时,wordpress导数据报错1067的问题
May 27 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
mysql中int(3)和int(10)的数值范围是否相同
Oct 16 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
Mysql使用全文索引(FullText index)的实例代码
Apr 03 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
优化Mysql查询的示例
Apr 26 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
Laravel 模型关联基础教程详解
2019/09/17 PHP
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
JS实现table表格数据排序功能(可支持动态数据+分页效果)
2016/05/26 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
使用vue制作探探滑动堆叠组件的实例代码
2018/03/07 Javascript
jQuery实现消息弹出框效果
2019/12/10 jQuery
解决vue cli4升级sass-loader(v8)后报错问题
2020/07/30 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
python3学习笔记之多进程分布式小例子
2018/02/13 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
python做反被爬保护的方法
2019/07/01 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
python调用HEG工具批量处理MODIS数据的方法及注意事项
2020/02/18 Python
Canvas制作的下雨动画的示例
2018/03/06 HTML / CSS
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
绩效专员岗位职责
2013/12/02 职场文书
大学生先进事迹材料
2014/02/16 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
个人整改方案范文
2014/10/25 职场文书
服务明星事迹材料
2014/12/29 职场文书
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
Java 异步任务计算FutureTask
2022/04/28 Java/Android
MySQL 数据 data 基本操作
2022/05/04 MySQL