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

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方留言必回,有问必答!

每天 08:35 更新文章,每天进步一点点...

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

1bcfb269a4bf5465b607210f5ccdb682.png

结合一下实例验证

实例1:

使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。推荐:Java进阶学习资料

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

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

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

c38148b812ff2ac0e5b5d82d7b9978ae.png ebb3d656716bce9288aeeb5a8d00d9a3.png 951d15e6aed2c03bfdd9825f559b1128.png

实例2:

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

13eac9cc61f7e58e2b1d3a697c6f101e.png ad0ba8810b11eb675cf8d971766e9582.png

实例3(索引):

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

91192cfc9d60dc508265964a46c8d785.png 57b615f419547e7de439ecddc2d7b32e.png f4f32efcc65e8d66e0b1983942c354ff.png

实例4:

使用普通的字段code去操作。推荐:Java进阶学习资料

208c5be85f9eb6a3b883cc8e2fb47b62.png 4278a0194d5443d321aad05a2ba66969.png d618fb9712d59d3c85521a66c5c38b8f.png

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

6b91191e76ac6d966bc1aa5486ca2d3c.png e6f150f6593bf51fd4f466b40380bc23.png

结果

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

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

作者:油锅里的猪

blog.csdn.net/qq_42956376/article/details/109544539

精品资料,超赞福利!

>Java精选面试题<
3000+ 道面试题在线刷,最新、最全 Java 面试题!

f2aac214dcaa76abe72da2b5c5b5bbba.png

4caaf4e19322b32e4b6be4a0a00042d2.png

期往精选  点击标题可跳转

【140期】阿里技术经理问:ReadWriteLock 读写之间互斥吗?

【141期】JDK8 Stream 操作 collectingAndThen:根据对象的属性去重

【142期】List 中 remove() 方法的“陷阱”,被坑惨了!

【143期】面试官问:说一说 Spring 和 Spring Boot 核心的 3 大区别?

【144期】拼多多面试官问:假设使用 Redis, 如何统计独立用户访问量?

【145期】面试官:Java 数组中 new Object[5] 语句是否创建了 5 个对象?

【146期】面试官问:说一说 RabbitMQ 的几种工作模式和优化建议?

【147期】面试官问:说一说 Lombok 中的 @Builder 作用和用法!

文章有帮助的话,在看,转发吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值