#查询是否锁表 SHOW OPEN TABLES WHERE IN_USE>0; #查询进程 SHOW PROCESSLIST #杀死进程(通常到这一步就解锁了) KILL ID; #查看正运行的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;; #查看正在锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; #查看等待锁的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; #解锁表 UNLOCK TABLES;
1)表中建立索引,SELECT ... WHERE 字段(必须是索引,不然行锁无效)。spa
注:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,而且该索引不能失效,不然都会从行锁升级为表锁。.net
二、必需要有事务,这样才是行锁(排他锁)。code
三、在SELECT语句后面加上FOR UPDATE。blog
#加事务 START TRANSACTION; #加锁 SELECT * FROM EMP WHERE ID<=10 FOR UPDATE; #解析 EXPLAIN SELECT * FROM EMP WHERE ID<=10 FOR UPDATE; #睡眠 SELECT SLEEP(3); #提交 COMMIT; #加事务 START TRANSACTION; #加锁 SELECT * FROM EMP WHERE ID BETWEEN 11 AND 20 FOR UPDATE; #解析 EXPLAIN SELECT * FROM EMP WHERE ID BETWEEN 11 AND 20 FOR UPDATE; #提交 COMMIT;
推荐博文:MySQL 表锁和行锁机制索引