14.3.5 LOCK TABLES and UNLOCK TABLES Syntax
14.3.5 LOCK TABLES and UNLOCK TABLES Syntax LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ... lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE UNLOCK TABLES MySQL让客户端sessions 获得表锁明确的用于配合其他会话访问表,或者阻止其他会话修改表 在一个session 需要排它访问它们时。一个session可以获得或者释放它自己的锁。 一个会话不能获得锁对于其他会话或者释放被其他会话持有的锁。 锁可以用于模拟事务或者得到更快的速度当更新表时, 这在本节中有更详细的解释: LOCK TABLES 显示的获得表锁用于当前客户端session,Tables locks 可以获得对于基表或者视图。 你必须有LOCK TABLES的权限,SELECT 权限对于每个被锁定的对象。 对于视图locking,LOCK TABLES 增加所有视图里的所有基表 到表集合被锁定,自动锁定它们。 如果你明确的lock 一个表 使用LOCK TABLES,任何表用于触发器的也会被锁定。 UNLOCK TABLES 显示的释放任何表的锁 被当前会话持有的。 LOCK TABLES 隐式的释放任何被当前会话持有的锁 在获得新的锁前 另外使用UNLOCK TABLES 是释放global read lock 通过FLUSH TABLES WITH READ LOCK语句获得, 让你lock 所有数据库的所有表 一个table lock只保护不合适的写和读通过其他会话。一个会话持有一个WRITE LOCK 可以执行表级操作 比如DROP TABLE or TRUNCATE TABLE. 下面的讨论只 应用于 non-TEMPORARY tables. LOCK TABLES 是被允许的对对于一个 TEMPORARY table. 表可以被自由访问 通过session,无论什么其他的锁可能生效,No lock 是需要的 因为其他会话看不到表。 锁定获取规则: 获得表锁 在当前会话,使用LOCK TABLES 语句,下面lock types 是可用的: READ [LOCAL] lock: 1.session 持有锁可以read表但是不能写 2.多个会话可以获得一个READ lock 对于一个表在同一时间 3.其他会话可以读表,而无需显示地获取READ lock. 4.LOCAL 修饰符让非冲突的INSERT语句(并发inserts)通过其他会话执行,当锁被持有时。 然而, READ LOCAL 不能被使用如果你是处理数据库使用处理外部到servver 当你持有锁时, 对于InnoDB,READ LOCAL is the same as READ. 低优先级 WRITE lock: 1. session 持有lock 可以读和写表 2.只有session 持有lock 可以访问表,其他session 不能访问表知道lock被释放 3.Lock 请求对于表通过其他会话 会被堵塞 当WRITE lock被持有 4.LOW_PRIORITY 修饰符没有作用,它是MYSQL以前的版本 如果LOCK TABLES 语句必须等待由于lock被其他会话持有,它被堵塞直到所有的locks 可以被获取 一个会话需要获得locks 必须获得所有的locks 需要一个单独的LOCK TABLES 语句。 当locks 因此得到是被保持, session 可以只可以访问被锁定的表。例子,下面的语句的顺序, 一个错误发生对于尝试访问t2,因为不是被锁定的 在LOCK TABLES 语句。 mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> lock table test read;
Query OK, 0 rows affected (0.00 sec) mysql> select * from test;
+------+-------+
| id | name |
+------+-------+
| NULL | a |
| 2 | b |
| 3 | c |
| 1 | a0101 |
| 4 | a |
| 4 | a |
| 5 | c |
| 10 | aa |
| 10 | aa |
+------+-------+
9 rows in set (0.00 sec) mysql> select * from xx;
ERROR 1100 (HY000): Table 'xx' was not locked with LOCK TABLES mysql> select user,host from mysql.user;
ERROR 1100 (HY000): Table 'user' was not locked with LOCK TABLES 表在INFORMATION_SCHEMA 是一个例外, 它们可以摆访问不需要被明确的锁定,即使当一个会话持有表locks 通过lock tables. 你不能指向一个locked table 多次 在一个单独的查询 使用相同的名字,使用别名代替,得到一个单独的多对于表和每个别名 mysql> LOCK TABLE t WRITE, t AS t1 READ;
mysql> INSERT INTO t SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> INSERT INTO t SELECT * FROM t AS t1; 第一个插入的错误发生 ,因为有2个引用到相同的表 对于一个锁定的表。 第2个INSERT 成功因为 引用到表使用不同的名字 如果你的语句指向一个表通过一个别名,你必须lock table 使用相同的alias. 它不会锁定表不指定别名 mysql> LOCK TABLE t READ;
mysql> SELECT * FROM t AS myalias;
ERROR 1100: Table 'myalias' was not locked with LOCK TABLES 相反,如果你lock一个表使用一个alias,你必须指向它在你的语句使用alais: mysql> LOCK TABLE t AS myalias READ;
mysql> SELECT * FROM t;
ERROR 1100: Table 't' was not locked with LOCK TABLES
mysql> SELECT * FROM t AS myalias; WRITE 锁通常有更好的优先级相比READ locks 来确保更新是尽可能快的处理。 这意味着如果一个session 得到一个READ lock 和然后其他的session 请求一个WRITE lock, 随后的READ lock 请求等待直到session 请求到的WRITE lock已经得到lock lock tabls 需要locks如下: 1.排序所有的tables 被锁定在一个内部定义的顺序,从用户角度看,这个顺序是不确定的。 2.如果表是被锁定使用一个read 和一个write lock,放置write lock 请求在read lock 请求前 3.锁定一个表一次 直到会话得到所有的locks 锁释放规则: 当一个table locks 被一个会话持有被释放,它们都被释放在相同的时间。 一个session 可以释放它自己的锁,或者locks 可以被影式释放。 1.一个session 可以显示的释放它的锁 2. 如果一个会话执行一个LOCK TABLES 语句来获得一个Lock当已经被持有了, 它的存在的锁会被隐式的释放 在新的锁被授予前 如果一个会话开始一个事务(比如, 使用START TRANSACTION),一个隐式的UNLCOK TABLES是被执行, 会导致存在的表的锁被释放 mysql> lock table test read;
Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(99,'aqs');
ERROR 1099 (HY000): Table 'test' was locked with a READ lock and can't be updated
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(99,'aqs');
Query OK, 1 row affected (0.00 sec)
14.3.5 LOCK TABLES and UNLOCK TABLES Syntax的更多相关文章
- LOCK TABLES和UNLOCK TABLES与Transactions的交互
LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...
- MySQL中lock tables和unlock tables浅析
MySQL中lock tables和unlock tables浅析 在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...
- LOCK TABLES 和 UNLOCK TABLES
MySQLdump的时LOCK TABLES 和 UNLOCK TABLES 在mysqldump后的数据中会发现有 LOCK TABLES tables_name WRITE;和结尾处有 UNLOC ...
- MySQL的lock tables和unlock tables的用法(转载)
早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...
- lock tables和unlock tables
1.lock tables table1 read,table2 read,table3 read igoodful@a8-apple-iphone-db00.wh(glc) > show ta ...
- mysql中lock tables与unlock tables
官网:https://dev.mysql.com/doc/refman/5.0/en/lock-tables.html LOCK TABLES tbl_name [[AS] alias] lock_t ...
- MySQL LOCK TABLES 与UNLOCK TABLES
http://blog.csdn.net/zyz511919766/article/details/16342003 1语法 LOCK TABLES tbl_name[[AS] alias] lock ...
- mysql中lock tables与unlock tables(锁表/解锁)使用总结
php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...
- 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器
14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...
随机推荐
- Bulk-Only传输协议 UFI命令块规范
USB设备分为5大类,即显示器.通信设备.音频设备.人机输入和海量存储.通常所用的U盘.移动硬盘均属于海量存储类.海量存储类的规范中包括4个独立的子规范,即CBI传输.Bulk-Only传输.ATA命 ...
- 主要协议SCSI、FC、iSCSI
一.SCSI SCSI是小型计算机系统接口(Small Computer System Interface)的简称,于1979首次提出,是为小型机研制的一种接口技术,现在已完全普及到了小型机,高低端服 ...
- 是否需要手动执行DataContext的Dispose方法?
我们知道DataContext实现了IDisposable接口.在C#中,凡是实现了IDisposable接口的类,都推荐的使用using语句.如下: using (DataContext db = ...
- eclipse工具再学习
今天下午最后近1小时及晚上2个多小时,我都花费时间在工程环境配置上,自尊心被严重摧残,各种郁闷和抱怨.源头是我部分刷新代码后运行工程依赖的jar报错,后来找同事发现是因为我没更新pom.xml文件,重 ...
- npm 常用命令详解[转]
npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...
- svo的一些博客解析
记录一边学习 白巧克力: svo代码笔记 http://blog.csdn.net/heyijia0327/article/details/51083398 卢彦斌:svo原理解析 东北大学孙志明:s ...
- java中a++与++a区别
java中a++与++a区别 a++与++a的区别,如果单独使用没有任何区别,如果在运算中就有区别了,a++是先运算在赋值,而++a是先赋值在运算!! 先看a++的代码哦 class demo1 { ...
- Linux下的压缩zip,解压缩unzip命令具体解释及实例
实例:压缩server上当前文件夹的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前文件夹 unzip filename.zip ================= ...
- (续)检测到有潜在危险的 Request.Form 值
继续昨天的问题“检测到有潜在危险的 Request.Form 值”,前面说如果不想取消数据验证那怎么避免这个问题. 既然是数据验证到危险值然后报错那么我们可不可以在验证的中间做一个处理让他不报错,比如 ...
- SQL Server 强行Insert包含自增列值的记录
SET IDENTITY_INSERT 表 ON INSERT INTO 表 ([ID] ,[SequenceNumber] ,[EnumCode] ,[Description]) VALUES ( ...