面试被问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 root密码的重置方法
Apr 21 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
Mysql systemctl start mysqld报错的问题解决
Jun 03 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
MySQL 用 limit 为什么会影响性能
Sep 15 MySQL
SQL基础的查询语句
Nov 11 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL Server层四个日志的实现
Mar 31 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
ThinkPHP中URL路径访问与模块控制器之间的关系
2014/08/23 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
php指定长度分割字符串str_split函数用法示例
2017/01/30 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
jquery下异步提交表单 异步跨域提交表单
2010/11/17 Javascript
jQuery easyui datagrid动态查询数据实例讲解
2013/02/26 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript中的Math.atan2()方法使用详解
2015/06/15 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
详解使用PM2管理nodejs进程
2017/10/24 NodeJs
Vue.js实现大转盘抽奖总结及实现思路
2019/10/09 Javascript
[01:45:05]VGJ.T vs Newbee Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python itertools模块详解
2015/05/09 Python
Python lxml模块安装教程
2015/06/02 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
超简单的Python HTTP服务
2019/07/22 Python
使用Python函数进行模块化的实现
2019/11/15 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
写一个用矩形法求定积分的通用函数
2012/11/08 面试题
关于递归的一道.NET面试题
2013/05/12 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
中学生运动会广播稿
2015/08/19 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技