MySQL学习笔记十二:锁表解锁与加行锁
一、锁表解锁
#查询是否锁表 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;
二、加行锁
2.1、创建行锁条件
1)表中创建索引,SELECT ... WHERE 字段(必须是索引,否则行锁无效)。
注:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,并且该索引不能失效,否则都会从行锁升级为表锁。
2、必须要有事务,这样才是行锁(排他锁)。
3、在SELECT语句后面加上FOR UPDATE。
2.2、示例
#加事务 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 表锁和行锁机制