mysql 锁表的情况

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';

不提交

mysql 锁表的情况_第1张图片

新开一个窗口B:

执行

START TRANSACTION;
update test set name='窗口B' where age='12';

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

mysql 锁表的情况_第2张图片

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

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

1 加索引 在age 上面加个索引,但是age必须要是唯一且不重复的数据,否则也会锁表

mysql 锁表的情况_第3张图片

2 利用当前行的唯一索引

 以上两种方案相当于变成了行级锁  完美解决

2 insert可能会造成死锁

具体看看下面的文章里面的内容:比较复杂

https://www.cnblogs.com/paul8339/p/6877729.html

 

 

你可能感兴趣的:(mysql)