思考 | select…for update会锁表还是锁行?
select查询语句是不会加锁的,但是select ….for update除外。
问题:
select …….for update加的是行锁还是表锁?
带着问题我们继续往下看。
验证:
建表sql
关闭自动提交:
案例一(主键):
开启第一个事务:
第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。
我们再开启一个事务对另一条id为2的数据进行更新,更新成功。
案例二 (索引):
age创建了唯一索引。
开启第一个事务:
第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。
我们再开启一个事务对另一条id为2的数据进行更新,更新成功。
案例三 (普通字段):
使用普通的字段name去操作,开启第一个事务。
第二个事务去更新数据,被阻塞了,长时间拿不到锁报错。
我们再开启一个事务对另一条id为2的数据进行更新,如果我更新成功了,就是锁行,失败了就是锁表。
结论:
如果查询条件用了索引/主键,那么select … for update就会进行行锁。
如果是普通字段(没有索引/主键),那么select … for update就会进行锁表。
更多精彩内容,关注我们
▼▼
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了