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

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

来源:blog.csdn.net/qq_42956376/

article/details/109544539


后端专属技术群

构建高质量的技术交流社群,欢迎从事编程开发、技术招聘HR进群,也欢迎大家分享自己公司的内推信息,相互帮助,一起进步!

文明发言,以交流技术职位内推行业探讨为主

广告人士勿入,切勿轻信私聊,防止被骗

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

加我好友,拉你进群

原文始发于微信公众号(Java知音):面试官问:select……for update会锁表还是锁行?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/160232.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!