版权声明:本文为博主原创文章,未经博主允许不得转载。 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表