MySQL的lock tables和unlock tables的用法

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下测试经过。

相关文章
相关标签/搜索