推荐关注
以下文章来源Java后端栈,回复”面试“获面试宝典
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将后端君的公众号 加星标置顶 ,在此真诚的表示感谢~
来源: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代表自动提交。
使用主键id为条件去查询,然后开启另一个事务去更新数据,更新被阻塞,加锁了,锁定要查询的id为1的行数据。
图一为第一个事务,并且没有提交事务
图二为第二个事务,去更新数据,被阻塞了
图三为第二个事务,长时间拿不到锁报错。
我们在开启一个事务对另一条id为2的数据进行更新,
一开始的创建表就age创建了唯一索引。另外,搜索公众号GitHub猿回复“打飞机”,送你一份惊喜礼包。
使用普通的字段code去操作
另一个事务我去更新另外一条数据,如果我更新成功了,就是锁行,失败了就是锁表。关注Java后端栈
如果查询条件用了索引/主键,那么select ..... for update就会进行行锁。
如果是普通字段(没有索引/主键),那么select ..... for update就会进行锁表。
最后给读者整理了一份BAT大厂面试真题,需要的可扫码加微信备注:“面试”获取。
◆ ◆ ◆ ◆ ◆
字节跳动面试经验总结,已顺利拿到offer!
一款神仙接私活低代码平台,吊到不行(附源码)
IntelliJ IDEA这样配置,代码效率嗖嗖的~
Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
分享一个牛逼的 Java 开源后台管理系统,不要造轮子了!
硬核!一套基于SpringBoot + Vue 的开源物联网智能家居系统(附源码)!
基于 SpringBoot2 + MybatisPlus 的商城管理系统(附源码)
重磅推荐:一套开源的网校系统,无论是自建网校还是接副业都很方便
一个很酷的数据可视化大屏项目
学会 IDEA 的这个功能,阅读源码简直太简单了!!!
面试官问:生成订单30分钟未支付,则自动取消,该怎么实现?
还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!
Maven 最全教程,看了必懂,99% 的人都收藏了!
欢迎添加栈哥个人微信 ysle007 进粉丝群或围观朋友圈
扫码关注带你吊爆Java后端技术
文章有问题?点此查看未经处理的缓存