1、lock tables table1 read,table2 read,table3 read

igoodful@a8-apple-iphone-db00.wh(glc) > show tables;
+---------------+
| Tables_in_glc |
+---------------+
| mobile |
| user |
+---------------+
2 rows in set (0.00 sec) Fri Dec 20 17:42:35 2019
igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use >=1;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| glc | user | 1 | 0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec) Fri Dec 20 17:42:47 2019
igoodful@a8-apple-iphone-db00.wh(glc) > lock tables user read; ######### 添加读锁
Query OK, 0 rows affected (0.00 sec) Fri Dec 20 17:43:03 2019
igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use >=1; ########## 表明:添加表读锁后,表被用次数加一
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| glc | user | 2 | 0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec) Fri Dec 20 17:43:08 2019
igoodful@a8-apple-iphone-db00.wh(glc) > select * from user; ########## 表明:可以读取锁住的表的数据。
+------+------+
| id | name |
+------+------+
| 1 | 1 |
| 2 | 1 |
+------+------+
2 rows in set (0.01 sec) Fri Dec 20 17:43:37 2019
igoodful@a8-apple-iphone-db00.wh(glc) > select * from mobile; ########## 表明:只能读取锁住的表的数据,不能查看没有锁住的表的数据
ERROR 1100 (HY000): Table 'mobile' was not locked with LOCK TABLES
Fri Dec 20 17:44:11 2019
igoodful@a8-apple-iphone-db00.wh(glc) >

########################################

在另一个会话线程中执行如下语句:

igoodful@a8-apple-iphone-db00.wh(glc) > select * from user;      ################# 表明:一个会话给表添加了读锁,那么不影响其他会话线程读取该表数据
+------+------+
| id | name |
+------+------+
| 1 | 1 |
| 2 | 1 |
+------+------+
2 rows in set (0.00 sec) Fri Dec 20 17:54:11 2019
igoodful@a8-apple-iphone-db00.wh(glc) > insert into user values (3,'3'); ################# 表明:一个会话给表添加了读锁,其他会话线程只能对该表进行读取,而不能对该表执行执行dml和ddl语句。
^CCtrl-C -- sending "KILL QUERY 233531" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
Fri Dec 20 17:55:59 2019
igoodful@a8-apple-iphone-db00.wh(glc) > select connection_id();
+-----------------+
| connection_id() |
+-----------------+
| 233531 |
+-----------------+
1 row in set (0.00 sec) Fri Dec 20 17:57:07 2019
igoodful@a8-apple-iphone-db00.wh(glc) > show open tables where in_use>0;;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| glc | user | 2 | 0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec) ERROR:
No query specified Fri Dec 20 17:57:25 2019
igoodful@a8-apple-iphone-db00.wh(glc) > lock tables user read; ################# 表明:多个会话线程可以对同一张表添加读锁。
Query OK, 0 rows affected (0.00 sec) Fri Dec 20 17:57:57 2019
igoodful@a8-apple-iphone-db00.wh(glc) >

一、表的读锁

如果一个会话线程执行了:lock tables table1  read, table2  read;

则有:

)、该会话线程只能查询锁定的这几个表(table1,table2)的数据,没有被锁定的表,不能查询其数据

)、其他事务不能对这两张表进行ddl、dml操作和write表锁

)、其他会话可以对这两个表添加read锁,即表的读锁是共享锁,可以多个会话线程同时添加,互不影响

)、这两张表当前被查询使用次数分别增加1,当执行会话执行 unlock tables语句时,这两张表当前被查询使用使用次数分别减1
igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
+--------------------+-------------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+--------------------+-------------------+--------+-------------+
| glc | mobile | 0 | 0 |
| mysql | db | 0 | 0 |
| test | host | 0 | 0 |
| performance_schema | session_variables | 0 | 0 |
| glc | user | 2 | 0 |
| test | user | 0 | 0 |
| mysql | user | 0 | 0 |
+--------------------+-------------------+--------+-------------+
7 rows in set (0.00 sec) Fri Dec 20 18:16:10 2019
igoodful@a8-apple-iphone-db00.wh(glc) > ##################################################################
1、出现在里面的表,表示的是:这些表都是打开的,且不是临时表。
2、如果In_use字段为0,则表示该表当前是被打开的状态,但是当前没有被使用。
3、如果In_use字段为2,则表示该表当前是被打开的状态,且正在被使用次数为2。
################################################################## igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
+--------------------+-------------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+--------------------+-------------------+--------+-------------+
| glc | mobile | 0 | 0 |
| mysql | db | 0 | 0 |
| test | host | 0 | 0 |
| performance_schema | session_variables | 0 | 0 |
| glc | user | 2 | 0 |
| test | user | 0 | 0 |
| mysql | user | 0 | 0 |
+--------------------+-------------------+--------+-------------+
7 rows in set (0.00 sec) Fri Dec 20 18:16:10 2019
igoodful@a8-apple-iphone-db00.wh(glc) > flush tables;
Query OK, 0 rows affected (47.94 sec) Fri Dec 20 18:22:19 2019
igoodful@a8-apple-iphone-db00.wh(glc) > show open tables;
Empty set (0.00 sec) Fri Dec 20 18:23:00 2019 ###########################################################################
1、flush tables会将缓存的所有表全部清空,即要读取这些表的数据就必须从磁盘加载到缓存。
2、当缓冲数目已经超过了table_open_cache设置的值,mysql开始使用LRU算法释放表对象。
3、当缓冲区已满,而连接想要打开一个不在缓冲中的表时。
##########################################################

二、表的写锁

如果一个会话线程执行了:lock tables table1  write, table2  write;

则有:

)、该会话线程只能查询锁定的这几个表(table1,table2)的数据,没有被锁定的表,不能查询其数据

)、其他事务不能对这两张表进行ddl、dml操作、read表锁、write表锁,select读取这两张表也不行,表的写锁是互斥锁。

)、这两张表当前被查询使用次数分别增加1,当执行会话执行 unlock tables语句时,这两张表当前被查询使用使用次数分别减1

3、表的解锁

LOCK TABLES语句为当前会话显式的获取表锁。
UNLOCK TABLES语句为当前会话显式的释放所有表锁(读写)。
lock tables与unlock tables只能为自己获取锁和释放锁,不能为其他会话获取锁,也不能释放由其他会话保持的锁。
一个对象获取锁,需具备该对象上的SELECT权限和LOCK TABLES权限。
#####################################################################
####################################################################
1、但是当会话发出另外一个LOCK TABLES时,当前会话锁定的所有表会隐式被解锁;
2、当服务器的连接被关闭时,当前会话锁定的所有表会隐式被解锁;

lock tables和unlock tables的更多相关文章

  1. LOCK TABLES和UNLOCK TABLES与Transactions的交互

    LOCK TABLES对事务不安全,并且在试图锁定表之前隐式提交任何活动事务. UNLOCK TABLES只有在LOCK TABLES已经获取到表锁时,会隐式提交任何活动事务.对于下面的一组语句,UN ...

  2. 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 ...

  3. MySQL中lock tables和unlock tables浅析

    MySQL中lock tables和unlock tables浅析   在MySQL中提供了锁定表(lock tables)和解锁表(unlock tables)的语法功能,ORACLE与SQL Se ...

  4. LOCK TABLES 和 UNLOCK TABLES

    MySQLdump的时LOCK TABLES 和 UNLOCK TABLES 在mysqldump后的数据中会发现有 LOCK TABLES tables_name WRITE;和结尾处有 UNLOC ...

  5. MySQL的lock tables和unlock tables的用法(转载)

    早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的 ...

  6. 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 ...

  7. MySQL LOCK TABLES 与UNLOCK TABLES

    http://blog.csdn.net/zyz511919766/article/details/16342003 1语法 LOCK TABLES tbl_name[[AS] alias] lock ...

  8. mysql中lock tables与unlock tables(锁表/解锁)使用总结

    php mysql lock tables 使用有感 mysql 的 表锁 lock tables 感觉就像一个 封闭的空间 mysql发现 lock tables 命令的时候,会将带有锁标记的表(t ...

  9. 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析

    关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...

随机推荐

  1. c# winForm DotNetBar控件之SuperGridControl

    1.添加表头 sgc.PrimaryGrid.SelectionGranularity = SelectionGranularity.Row;//点击选中一行 DevComponents.DotNet ...

  2. .net 委托 +lamda表达式

    1.委托与类同级 想当于定义了一个类型 如 delegate int Sum(int a, int b);// 在声明类之前声明 2.这里可以在类里写个函数 public int sumAB(int ...

  3. python库argparse中type的新奇指定方法

    最近在看一些项目的源码,总是能学到好多东西. 关于arparse中type的类型指定 不止可以指定常规类型,还可以加一些自己类型判断,具体用法如下(来源): def str2bool(v): &quo ...

  4. Android网络(3):HttpClient作client,Tomcat Servlet作server的交互演示样例

    前面相继介绍了Android网络编程里的Socket传输图片.HttpURLConnection,今天看HttpClient. 第一部分:JavaEE版的Eclipse配置Tomcat [备注:开发后 ...

  5. Jmeter 请求参数中包含 MD5 加密的密码

    如何在jmeter中对参数进行加密 使用工具:java+myeclipse 让开发将他的加密类从eclipse中导出来打成jar包,放在jmeter安装文件夹lib文件夹中%JMETER HOME%\ ...

  6. python接口自动化(delete请求)

    python接口自动化(delete请求) 一.delete请求的目的:删除资源 二.应用 导包:import requests 调用delete方法:requests.delete(url) 获取响 ...

  7. 2018-2-13-win10-uwp-入门

    title author date CreateTime categories win10 uwp 入门 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:23 ...

  8. <el-table>序号逐次增加,翻页时继续累加,解决翻页时从编号1开始的情况

    注释: scope.$index     当前序号 cuePage 表示当前页码 pageSize   表示每页显示的条数

  9. 使用babel转码器,让浏览器支持es6语法

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,可是很多浏览器并不支持es6语法,所以我们需要一个转码工具, 把es6的语法转换成浏览器支持的javascr ...

  10. 陈云pytorch学习笔记_用50行代码搭建ResNet

    import torch as t import torch.nn as nn import torch.nn.functional as F from torchvision import mode ...