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

共 861字,需浏览 2分钟

 ·

2021-11-14 05:13

来源:网络
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代表自动提交。b75cb86db872f9cad51540b2795dc8ce.webp

结合一下实例验证

实例1:使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。
  • 图一为第一个事务,并且没有提交事务
  • 图二为第二个事务,去更新数据,被阻塞了
  • 图三为第二个事务,长时间拿不到锁报错。
9bba6b4e9759e05c149203c1ec7fc19d.webp87992ecc76a2d22939aeae2101f7e89d.webp2850613fd12dd4e8b44af306b4179e45.webp实例2:我们在开启一个事务对另一条id为2的数据进行更新,d0ea5190ffa8f4ffcdfa3b63bea5bf0e.webp4e0e030cd3837b97bdaa3930bdc8df55.webp实例3(索引):一开始的创建表就age创建了唯一索引。搜索公众号顶级架构师回复“架构”,送你一份惊喜礼包。c7cd7d330d667197960373a787acf507.webp7f4116ba538b5cdc6ae4c2beac8204c4.webp034c58e781d1ee0e9a8c5979337c355b.webp实例4:使用普通的字段code去操作3eb934441f6ba7217ea4ec86314d8512.webpefa3ee465daf2bfefab8e28c4bb8ee59.webp2ed6b2b4f07c6231a4316b6603a11196.webp另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。1837830050d2c6c2788d55c272ccc2ae.webp71c78d0c41c80cb597ea0e0b095d408d.webp

结果:

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


浏览 80
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报