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');

对其他表的操作不影响:

结论:其他线程 可读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');

对其他表的操作不影响:

结论:其他线程 不可读写lock表; 可读写其他表

3. 结论:

LOCK TABLES为当前线程锁定表。 UNLOCK TABLES释放被当前线程持有的任何锁。当线程发出另外一个 LOCK TABLES时,或当服务器的连接被关闭时 ,当前线程锁定的所有表会自动被解锁

如果一个线程获得一个表上的一个READ锁该持锁的线程和所有其他线程 只能从表中读,不可写;
如果一个线程获得一个表上的一个WRITE锁 ,那么只有持锁的线程能READ或WRITE表,其他线程被阻止