面试被问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 05 MySQL
JDBC连接的六步实例代码(与mysql连接)
May 12 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
Mysql实现简易版搜索引擎的示例代码
Aug 30 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
优化Mysql查询的示例
Apr 26 MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
May 15 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
php中使用redis队列操作实例代码
2013/02/07 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
php时间计算相关问题小结
2016/05/09 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
轻松实现JavaScript图片切换
2016/01/12 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
package.json文件配置详解
2017/06/15 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
JS中的Replace()传入函数时的用法详解
2017/09/11 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
[01:02:53]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第二局
2016/03/06 DOTA
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
初步探究Python程序的执行原理
2015/04/11 Python
Python入门_条件控制(详解)
2017/05/16 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
HTML5里的placeholder属性使用实例和美化显示效果的方法
2014/04/23 HTML / CSS
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
中学老师的自我评价
2013/11/07 职场文书
暑期实习鉴定
2013/12/16 职场文书
公司财务自我评价分享
2013/12/17 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
60句有关成长的名言
2019/09/04 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python