MySQL学习笔记十二:锁表解锁与加行锁

1、锁表解锁

#查询是否锁表
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、加行锁

2.一、建立行锁条件

1)表中建立索引,SELECT ... WHERE 字段(必须是索引,不然行锁无效)。spa

注:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁,而且该索引不能失效,不然都会从行锁升级为表锁。.net

二、必需要有事务,这样才是行锁(排他锁)。code

三、在SELECT语句后面加上FOR UPDATE。blog

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 表锁和行锁机制索引