mysql 表级锁之一lock table
1.lock table t1 read:
1.1.当前线程: 读/写当前表/其他表:
unlock tables;
lock table t1 read;
select * from t1;
INSERT INTO `t1` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
select * from t2;
INSERT INTO `t2` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
结果:
结论:当前线程 可读lock表,不可写lock表;不可读写其他表
1.2.其他线程: 读/写当前表/其他表:
其他线程可以读,不可以写;
select * from t1;
INSERT INTO `t1` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
对其他表的操作不影响:
![](https://img2023.cnblogs.com/blog/841795/202311/841795-20231112220259136-982199160.png)
结论:其他线程 可读lock表,不可写lock表; 可读写其他表
2.lock table t1 write
2.1.当前线程: 读/写当前表/其他表:
unlock tables;
lock table t1 write;
select * from t1;
INSERT INTO `t1` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
select * from t2;
INSERT INTO `t2` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
结果:
结论:当前线程 可读写lock表;不可读写其他表
2.2.其他线程: 读/写当前表/其他表:
其他线程执行以下读写会卡死等待中:
select * from t1;
INSERT INTO `t1` (`c2`, `c3`, `c4`) VALUES ('1', '1', '1');
对其他表的操作不影响:
![](https://img2023.cnblogs.com/blog/841795/202311/841795-20231112220259136-982199160.png)
结论:其他线程 不可读写lock表; 可读写其他表
3. 结论:
LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个LOCK TABLES时,或当服务器的连接被关闭时,当前线程锁定的所有表会自动被解锁。
如果一个线程获得一个表上的一个READ锁, 该持锁的线程和所有其他线程只能从表中读,不可写;
如果一个线程获得一个表上的一个WRITE锁,那么只有持锁的线程能READ或WRITE表,其他线程被阻止。