Mysql锁表查询和解锁操作
1、在做数据库操作时,有时会因为自己的粗心或者程序设计上的缺陷导致锁表,在mysql中查看锁表和解锁的步骤如下:
//1.查看当前数据库锁表的情况
SELECT * FROM information_schema.INNODB_TRX;
//2.杀掉查询结果中锁表的trx_mysql_thread_id
kill trx_mysql_thread_id
2、另外一种查询锁方法
1、查询是否锁表
show OPEN TABLES where In_use > 0;
2、查询进程
show processlist
查询到相对应的进程===然后 kill id
补充:
查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
遇到的问题:
这个查询语句导致了锁表问题,对它进行优化
SELECT ba.*,ac.IsEffective
FROM TB_YX_BASE_ACTIVATION ba,TB_YX_ACTIVATION_CODE ac
WHERE ba.Id = ac.BaseActivationId AND ba.`Status` = 2 AND ac.IsEffective < 3;
发生锁表的原因:
多表联合查询时,使用where和and组合进行查询会导致笛卡尔积扫描
解决方式:
使用join连接,并且不要使用ba.*
优化后的sql语句:
SELECT ba.Id,ba.`Type`,ba.NewUserOnly,ba.Name,ba.Channel,ba.CodeCount,ba.CodePrefix,ba.ActiveCount,ba.`Status`,ba.ValidStartTime,ba.ValidEndTime,ba.CreatUser,
ba.UpdateUser,ba.CreateTime,ba.UpdateTime,ba.IsEdit,ac.IsEffective
FROM TB_YX_BASE_ACTIVATION ba
LEFT JOIN TB_YX_ACTIVATION_CODE ac ON ba.Id = ac.BaseActivationId
WHERE ba.`Status` = 2 AND ac.IsEffective < 3;