面试官问:select......for update会锁表还是锁行?

我是程序汪

共 1292字,需浏览 3分钟

 · 2022-09-23

  • 验证
  • 结合一下实例验证
  • 结果



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代表自动提交。



结合一下实例验证


实例1:


使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。


图一为第一个事务,并且没有提交事务


图二为第二个事务,去更新数据,被阻塞了


图三为第二个事务,长时间拿不到锁报错。




 

实例2:


我们在开启一个事务对另一条id为2的数据进行更新,




实例3(索引):


一开始的创建表就age创建了唯一索引。





实例4:


使用普通的字段code去操作





另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。




结果:


如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。


如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。


来源:blog.csdn.net/qq_42956376/article/details/109544539


程序汪资料链接

程序汪接的7个私活都在这里,经验整理

Java项目分享  最新整理全集,找项目不累啦 07版

堪称神级的Spring Boot手册,从基础入门到实战进阶

卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!

卧槽!阿里大佬总结的《图解Java》火了,完整版PDF开放下载!

字节跳动总结的设计模式 PDF 火了,完整版开放下载!

欢迎添加程序汪个人微信 itwang009  进粉丝群或围观朋友圈

浏览 18
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报