lock tables和unlock tables

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

[email protected](glc) > show tables;
+---------------+
| Tables_in_glc |
+---------------+
| mobile        |
| user          |
+---------------+
2 rows in set (0.00 sec)

Fri Dec 20 17:42:35 2019
[email protected]-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
[email protected]-apple-iphone-db00.wh(glc) > lock tables user read;                          ######### 添加读锁
Query OK, 0 rows affected (0.00 sec)

Fri Dec 20 17:43:03 2019
[email protected]-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
[email protected]-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
[email protected]-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
[email protected]-apple-iphone-db00.wh(glc) >

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

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

[email protected](glc) > select * from user;      ################# 表明:一个会话给表添加了读锁,那么不影响其他会话线程读取该表数据
+------+------+
| id   | name |
+------+------+
|    1 | 1    |
|    2 | 1    |
+------+------+
2 rows in set (0.00 sec)

Fri Dec 20 17:54:11 2019
[email protected]-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
[email protected]-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
[email protected]-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
[email protected]-apple-iphone-db00.wh(glc) > lock tables user read;       ################# 表明:多个会话线程可以对同一张表添加读锁。
Query OK, 0 rows affected (0.00 sec)

Fri Dec 20 17:57:57 2019
[email protected]-apple-iphone-db00.wh(glc) >

当一个会话线程执行:

use glc;

lock tables user read;

那么

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

2)、同时阻止其他会话对锁住的表进行事务操作语句和添加write表锁,

3)、其他会话可以对同一个表添加read锁,

4)

执行

原文地址:https://www.cnblogs.com/igoodful/p/12074396.html

时间: 2024-11-01 11:16:05

lock tables和unlock tables的相关文章

MySQL的lock tables和unlock tables的用法

早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的用法. lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read; 另外一种是写锁定,用命令lock tables tablename write.下边分别介绍: 1. lock table 读锁定 如果一个线程

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

早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定.但是具体如何用,怎么用,不太清楚.今天详细研究了下,总算搞明白了2者的用法. lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另外一种是写锁定,用命令lock tables tablename write.下边分别介绍: 1. lock table 读锁定 如果一个线程获

Oracle Schema Objects——Tables——Overview of Tables

Overview of Tables A table is the basic unit of data organization in an Oracle database. 表是Oracle数据库中的数据组织的基本单位. A table describes an entity, which is something of significance about which information must be recorded. 一个表描述了一个实体,其相关重要信息必须被记录. A tabl

mysql出现大量FLUSH TABLES WITH READ LOCK

解决办法 故障总结 系统中的global read lock被其它线程获取了(被加上了S锁),因此DML在grl上面加IX锁时会出现Waiting for global read lock,而set read_only在grl上加的是S锁,因此此时是可以grant的,而此时系统中存在大查询,set global read_only=1需要等待表被关闭,因此状态是:Waiting for table flush 因此原因可以确定了:系统中存在flush tables with read lock但

mysql AB 的基本搭建

Mysql的AB复制 实验环境 Master 172.25.23.4 Slave1 172.25.23.5 Slave2 172.25.23.6 Selinux iptables disabled 加解析 注意:mysql的AB复制,master和slave的数据库版本要么一样,要么slave的版本高于master Mysql 5.1 一.Mysql 的AB 复制 MASTER 1.安装软件 yum install -y mysql-server 2.修改配置文件,启动服务 (1)初始化数据库

mysqldump原理3

现网中数据库运维时,要经常对数据库做热备.为保证恢复时数据的完整性与一致性, 一种方法是在备份之前锁表,但锁表会影响正在运行的业务. mysqldump是当前MySQL中最常用的备份工具,通过mysqldump --help可以查看很多选项. 在mysqldump开始备份后,执行其它的更新数据库操作,mysqldump备份的结果会不会包含备份结束前对数据库的更改呢?在一个时间点备份,最理想的结果是备份的结果就是备份开始时的数据库快照.通过选择合适的选项做备份,mysqldump可以保证数据一致性

mysqldump 的用法

--add-drop--database 在每个CREATE DATABASE语句前添加DROP DATABASE语句. --add-drop-tables 在每个CREATE TABLE语句前添加DROP TABLE语句. --add-locking 用LOCK TABLES和UNLOCK TABLES语句引用每个表转储.重载转储文件时插入得更快. --all--database,-A 转储所有数据库中的所有表.与使用---database选项相同,在命令行中命名所有数据库. --allow-

mysql 常用命令(备忘)

1:使用SHOW语句找出在服务器上当前存在什么数据库:mysql> SHOW DATABASES; 2:2.创建一个数据库MYSQLDATAmysql> CREATE DATABASE MYSQLDATA;3:选择你所创建的数据库 mysql> USE MYSQLDATA; (按回车键出现Database changed 时说明操作成功!) 4:查看现在的数据库中存在什么表mysql> SHOW TABLES;5:创建一个数据库表mysql> CREATE TABLE MYT

mysql轮廓总结

架构=数据类型.索引.分片.主从复制原理.数据备份 学习软件,都应该先从架构入手,每一层掌握就行.mysql难吗?从其架构层开始,就不难啦. 架构结构:http://www.cnblogs.com/hustcat/archive/2009/10/18/1585626.html 连接层--多线程>并发>读锁和写锁>锁的粒度表锁.行锁,MySQL支持LOCK TABLES和UNLOCK TABLES,但这些都是在服务器层实现的,而不是在存储引擎.它们有用处,但是不能取代存储引擎完成事务处理,