lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另一种是写锁定,用命令lock tables tablename write.下边分别介绍:mysql
1. lock table 读锁定sql
若是一个线程得到在一个表上的read锁,那么该线程和全部其余线程只能从表中读数据,不能进行任何写操做。测试
下边咱们测试下,测试表为user表。spa
不一样的线程,能够经过开多个命令行MySQL客户端来实现:.net
时刻点命令行 |
线程A(命令行窗口A)线程 |
线程B(命令行窗口B)事务 |
|
|
|
1ci |
mysql> lock tables user read;资源 Query OK, 0 rows affected (0.00 sec) mysql> 对user表加读锁定。 |
|
2 |
mysql> select * from user; +------+-----------+ | id | name | +------+-----------+ | 22 | abc | | 223 | dabc | | 2232 | dddabc | | 45 | asdsagd | | 23 | ddddddddd | +------+-----------+ 5 rows in set (0.00 sec) mysql> 本身的读操做未被阻塞 |
mysql> select * from user; +------+-----------+ | id | name | +------+-----------+ | 22 | abc | | 223 | dabc | | 2232 | dddabc | | 45 | asdsagd | | 23 | ddddddddd | +------+-----------+ 5 rows in set (0.00 sec) mysql> 其余线程的读也未被阻塞 |
3 |
mysql> insert into user values(12,'test'); ERROR 1099 (HY000): Table 'user' was locked with a READ lock and can't be updated mysql> 发现本线程的写操做被阻塞 |
mysql> insert into user values(22,'2test'); 发现没有任何反应,一直等待中,说明没有获得写锁定,一直处于等待中。 |
4 |
mysql> unlock tables; Query OK, 0 rows affected (0.00 sec) mysql> 释放读锁定。 |
mysql> insert into user values(22,'ddd'); Query OK, 1 row affected (1 min 27.25 sec) mysql> 在线程A释放读锁后,线程B得到了资源,刚才等待的写操做执行了。 |
5 |
mysql> lock tables user read local; Query OK, 0 rows affected (0.00 sec) mysql> 得到读锁定的时候增长local选项。 |
mysql> insert into user values(2,'b'); Query OK, 1 row affected (0.00 sec) mysql> 发现其余线程的insert未被阻塞。 |
6 |
|
mysql> update user set name = 'aaaaaaaaaaaaaaaaaaaaa' where id = 1; 可是其余线程的update操做被阻塞了。 |
注意:user表必须为Myisam表,以上测试才能所有OK,若是user表为innodb表,则lock tables user read local命令可能没有效果,也就是说,若是user表为innodb表,第6时刻将不会被阻塞,这是由于INNODB表是事务型的,对于事务表,例如InnoDB和BDB,--single-transaction是一个更好的选项,由于它不根本须要锁定表
2. lock table 写锁定
若是一个线程在一个表上获得一个 WRITE 锁,那么只有拥有这个锁的线程能够从表中读取和写表。其它的线程被阻塞。
写锁定的命令:lock tables user write.user表为Myisam类型的表。
参考以下测试:
时刻点 |
线程A(命令行窗口A) |
线程B(命令行窗口B) |
|
|
|
1 |
mysql> lock tables user write; Query OK, 0 rows affected (0.00 sec) 对user表加写锁定。 |
|
2 |
mysql> select * from user; +----+-----------------------+ | id | name | +----+-----------------------+ | 1 | aaaaaaaaaaaaaaaaaaaaa | | 2 | b | +----+-----------------------+ 2 rows in set (0.00 sec) 本身能够继续进行读操做 |
mysql> select * from user; 其余线程读操做被阻塞。 |
3 |
mysql> unlock tables ; Query OK, 0 rows affected (0.00 sec) 释放锁定。 |
|
4 |
mysql> select * from user; +----+-----------------------+ | id | name | +----+-----------------------+ | 1 | aaaaaaaaaaaaaaaaaaaaa | | 2 | b | +----+-----------------------+ 2 rows in set (32.56 sec) 其余线程得到资源,能够读数据了。 |
以上全部结果均在MySQL 5.4.3下测试经过。