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

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

点击关注 👉 Java技术江湖 2022-09-30 07:59 发表于广东

点击上方“Java技术江湖”,选择“设为星标”

回复”666“获取全网最热的Java核心知识点整理

Java技术江湖
一位阿里 Java 工程师的技术小站。专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、网络、多线程,同时也分享技术干货和学习经验,致力于Java全栈开发!
58篇原创内容

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

 

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就会进行锁表。

图片

面试官:说一下SpringBoot的自动配置原理


图片

“羊了个羊”通关修改思路


图片

我司为什么禁止使用阿里巴巴Java规范?

关注公众号【Java技术江湖】后回复“PDF”即可领取200+页的《Java工程师面试指南》

强烈推荐,几乎涵盖所有Java工程师必知必会的知识点,不管是复习还是面试,都很实用。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章