lock table read/write区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010719917/article/details/84301563

mysql lock
lock table table_nmae read|write
unlock tables 

root@localhost23:32:27[q]>lock table t1 read ;
root@localhost23:39:14[q]>show processlist ;
+----+------+-----------+--------------------+---------+------+----------+------------------+
| Id | User | Host      | db                 | Command | Time | State    | Info             |
+----+------+-----------+--------------------+---------+------+----------+------------------+
|  5 | root | localhost | q                  | Sleep   | 4344 |          | NULL             |
|  6 | root | localhost | q                  | Sleep   | 4431 |          | NULL             |
|  8 | root | localhost | information_schema | Sleep   | 4558 |          | NULL             |
| 10 | root | localhost | q                  | Query   |    0 | starting | show processlist |
| 11 | root | localhost | q                  | Sleep   |   27 |          | NULL             |
+----+------+-----------+--------------------+---------+------+----------+------------------+

当前会话操作只能对t1表read ,不能write:

root@localhost00:36:47[q]>select * from t1 ;
+------+------+
| name | age  |
+------+------+
| a6   |    6 |
| a5   |    5 |
| a6   |    6 |
| a    |    1 |
+------+------+
root@localhost00:36:52[q]>insert into t1 select 'z' ,100 ;
ERROR 1099 (HY000): Table 't1' was locked with a READ lock and can't be updated


当前会话对其它表不能read,write 

root@localhost00:37:17[q]>select * from node ;
ERROR 1100 (HY000): Table 'node' was not locked with LOCK TABLES

其它会话对表t1的dml操作都会metalock锁等待,对其它表没影响:
其它会话操作:

root@localhost23:39:19[q]>insert into t1 select *from  ; 卡住  metadata lock 等待。
root@localhost23:39:20[q]>show processlist ;
+----+------+-----------+--------------------+---------+------+---------------------------------+--------------------------------+
| Id | User | Host      | db                 | Command | Time | State                           | Info                           |
+----+------+-----------+--------------------+---------+------+---------------------------------+--------------------------------+
|  5 | root | localhost | q                  | Sleep   | 4397 |                                 | NULL                           |
|  6 | root | localhost | q                  | Sleep   | 4484 |                                 | NULL                           |
|  8 | root | localhost | information_schema | Sleep   | 4611 |                                 | NULL                           |
| 10 | root | localhost | q                  | Query   |    0 | starting                        | show processlist               |
| 11 | root | localhost | q                  | Query   |   32 | Waiting for table metadata lock | insert into t1 select *from t1 |
+----+------+-----------+--------------------+---------+------+---------------------------------+--------------------------------+

解锁

root@localhost23:40:13[q]>unlock table ;
Query OK, 0 rows affected (0.00 sec)
root@localhost23:39:19[q]>insert into t1 select *from t1 ;
Query OK, 3 rows affected (1 min 36.86 sec)
Records: 3  Duplicates: 0  Warnings: 0
root@localhost23:41:18[q]>show processlist ;
+----+------+-----------+--------------------+---------+------+----------+------------------+
| Id | User | Host      | db                 | Command | Time | State    | Info             |
+----+------+-----------+--------------------+---------+------+----------+------------------+
|  5 | root | localhost | q                  | Sleep   | 4485 |          | NULL             |
|  6 | root | localhost | q                  | Sleep   | 4572 |          | NULL             |
|  8 | root | localhost | information_schema | Sleep   | 4699 |          | NULL             |
| 10 | root | localhost | q                  | Query   |    0 | starting | show processlist |
| 11 | root | localhost | q                  | Sleep   |  120 |          | NULL             |
+----+------+-----------+--------------------+---------+------+----------+------------------+


LOCK TABLE t1 WRITE
write带read权限
当前会话可以对指定表t1进行read ,write ;其它表不行。

root@localhost00:25:59[q]>lock table t1 write ;
Query OK, 0 rows affected (5.03 sec)
root@localhost00:29:25[q]>show processlist ;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
| 18 | root | localhost | q    | Sleep   |    7 |          | NULL             |
| 22 | root | localhost | q    | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
root@localhost00:29:32[q]>select * from t1 ;
+------+------+
| name | age  |
+------+------+
| a6   |    6 |
| a5   |    5 |
| a6   |    6 |
+------+------+
root@localhost00:29:36[q]>insert into t1 select * from t1 ;
ERROR 1100 (HY000): Table 't1' was not locked with LOCK TABLES
root@localhost00:29:45[q]>insert into t1 select 'a',1 ;
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

root@localhost00:30:00[q]>select * from node limit 1 ;
ERROR 1100 (HY000): Table 'node' was not locked with LOCK TABLES

其它会话不能对表t1当前read,write ,其它可以正常操作

root@localhost00:29:25[q]>select * from t1 ;  -- 直接卡住
root@localhost00:31:05[q]>select * from node limit 1 ; -- 其它表正常
+----+------+-----------+
| id | name | parent_id |
+----+------+-----------+
| 11 | 3    |         0 |
+----+------+-----------+


锁的区别
lock tables/ flush table read lock 

flush table read lock: 全局读锁  ,解锁:unlock tables 
lock table  table_name read/write :指定表锁,解锁:unlock table table_name /unlock tables table_names 每次只能持一个锁

lock tables table read :没有会话能DML read-locked 表
lock tables table_name write :除了持有锁会话,没有会话能访问write-locked表
 

猜你喜欢

转载自blog.csdn.net/u010719917/article/details/84301563