面试被问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 相关文章推荐
数据库连接池
Apr 06 MySQL
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
MySQL Shell的介绍以及安装
Apr 24 MySQL
MySQL EXPLAIN输出列的详细解释
May 12 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
MySQL开启事务的方式
Jun 26 MySQL
MySQL优化及索引解析
Mar 17 MySQL
mysql 获取相邻数据项
May 11 MySQL
jdbc中自带MySQL 连接池实践示例
Jul 23 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 MySQL
MySQL中LAG()函数和LEAD()函数的使用
Aug 14 MySQL
mysql的数据压缩性能对比详情
Nov 07 #MySQL
Mysql数据库手动及定时备份步骤
一篇文章看懂MySQL主从复制与读写分离
MySQL基于索引的压力测试的实现
Nov 07 #MySQL
基于MySql验证的vsftpd虚拟用户
Nov 07 #MySQL
MySQL悲观锁与乐观锁的实现方案
SpringBoot连接MySQL获取数据写后端接口的操作方法
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
简单实用的.net DataTable导出Execl
2013/10/28 PHP
thinkphp配置文件路径的实现方法
2016/08/30 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
vue实现条件判断动态绑定样式的方法
2018/09/29 Javascript
Vue起步(无cli)的啊教程详解
2019/04/11 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现包含min函数的栈
2016/04/29 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
python画图常规设置方式
2020/03/05 Python
Python super()方法原理详解
2020/03/31 Python
超全Python图像处理讲解(多模块实现)
2020/04/13 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
html5使用canvas绘制一张图片
2014/12/15 HTML / CSS
成教毕业生自我鉴定
2013/10/23 职场文书
个性大学生自我评价
2013/12/04 职场文书
文秘人员工作职责
2014/01/31 职场文书
学生喝酒检讨书500字
2014/11/02 职场文书
部队个人年终总结
2015/03/02 职场文书
人口与计划生育责任书
2015/05/09 职场文书
企业宣传语大全
2015/07/13 职场文书