MySQL-lock tables和unlock tables
锁定表
语法
lock tables tab_name [as alias] {read[local]|[low_priority] write}
[,tab_name[as alias] {read[local]|[low_priority]write}]...
- local:可以允许在其它会话中对当前会话中获取了read锁的表执行插入。但是当保持锁时,若使用server外的会话来操作数据库则不能使用read local。另外,对于innodb表,read local于read相同
- low_priority:用于之前版本的MySQL,它会影响锁定行为,但是从MySQL5.6.5以后,这个修饰符已经被弃用。如果使用它则会产生警告
解锁表
语法
unlock tables
lock tables为当前会话锁定表。unlock tables释放被当前会话持有的任何锁。
read锁
如果一个会话在一个表上获得一个read锁后,该会话和所有其它会话只能从表中读。不能往表中写,其它会话也可在该表获取一个read锁,此时你会在show open tables里面看到in_use的值增加。其实lock tables read是一个表锁,而且是共享锁。但是当一个会话获取一个表上的read锁后,其它会话就不能获取该表的write锁了,此时就会被阻塞,知道持有read锁的会话释放read锁。
另外需要注意的是,当前会话如果锁定了其中一个表,那么是无法查询其它表的
write锁
当一个会话获得一个表上的一个write锁后,那么只有持有锁的会话可以读写表,其它会话都会被阻止。
unlock tables释放当前会话持有的任何锁,但是当会话发出另一个lock tables时,或当服务器的连接被关闭时,当前会话锁定的所有表都会隐式的被解锁
原文: