mysql查询锁表的sql

发布时间: 2023-11-21 10:34 阅读: 文章来源:1MUMB60PS

mysql其实在我们使用的时候比较容易造成表被锁的情况,尤其是高并发或者业务执行时间过长时,下面介绍一下几种容易除夕拿锁表的问题,如果错误的地方大家多多交流

例如以下的几种方式

目前有表 test , 字段分别有 id,name,age

show full PROCESSLIST 查询表的执行情况

1 查询时 mysql的innodb 支持for update 行级锁 (悲观锁)

select * from test where name=‘行锁‘ for update;

如果 name没有加索引则会造成锁表,直到事务执行完毕后

如果有索引的话就只会锁行

如果搜索条件增加了索引但是没有搜索到数据不会造成锁表

2 update/delete(删除就不做演示) 时

开启一个窗口A:

执行

START TRANSACTION;

update test set name=‘窗口A‘ where age=‘10‘;、

正在执行事务:无索引

不提交

新开一个窗口B:

执行

START TRANSACTION;

update test set name=‘窗口B‘ where age=‘12‘;

此时你会发现 窗口B没有任何反应如图:

正在执行事务:无索引

查询时间一直在增加,可见是进行了锁表

所以在高并发情况下就会出现这种锁表的情况导致后面的线程阻塞,那么怎么解决呢?

加索引 在age 上面加个索引

正在执行事务:添加索引后

加索引后就不会出现这个问题了,相当于变成了行级锁 完美解决

3 insert也会造成死锁

这个就比较复杂了有兴趣的朋友可以自行网上查查

如果大家觉得好可以点赞,关注一波,谢谢

•••展开全文