MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法


Posted in MySQL onApril 18, 2022

MySQL 表锁定

锁是与表关联的标志。MySQL允许客户端会话显式获取表锁,以防止其他会话在特定时间段内访问同一个表。客户端会话只能为自己获取或释放表锁。它无法获取或释放其他会话的表锁。

CREATE TABLE tbl (
  id INT NOT NULL AUTO_INCREMENT,
  col INT NOT NULL,
  PRIMARY KEY (id)
) Engine = InnoDB;

LOCK和UNLOCK TABLES语法

以下语句显式获取表锁:

LOCK TABLES table_name [READ | WRITE]

要锁定表,请在LOCK TABLES关键字后指定其名称。此外,您可以指定锁的类型,可以是 READ或 WRITE。

要释放表的锁,请使用以下语句:

UNLOCK TABLES;

读锁

READ锁具有以下特点:

  • READ可以通过多个会话同时获取表的锁。此外,其他会话可以从表中读取数据而无需获取锁。
  • 持有READ锁的会话只能读取表中的数据,但无法写入。此外,在READ释放锁之前,其他会话无法将数据写入表。来自另一个会话的写入操作将进入等待状态,直到READ锁定被释放。
  • 如果会话正常或异常终止,MySQL将隐式释放所有锁。此功能也与WRITE锁相关。

示例:

在第一个会话中,首先,连接到mysqldemo数据库并使用CONNECTION_ID()函数获取当前连接ID,如下所示:

SELECT CONNECTION_ID();

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

然后,在tbl表中插入一个新行。

INSERT INTO tbl(col) VALUES(10);

接下来,查询tbl表中的数据。

SELECT * FROM tbl;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

之后,要获取锁定,请使用LOCK TABLE语句。

LOCK TABLE tbl READ;

最后,在同一个会话中,如果您尝试在tbl表中插入新行,则会收到错误消息。

INSERT INTO tbl(col) VALUES(11);

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

因此,一旦READ获取了锁,就无法在同一会话中将数据写入表中。

从另一个会话中检查锁定。
首先,连接到mysqldemo并检查连接ID:

SELECT CONNECTION_ID();

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

然后,从tbl 表中检索数据:

SELECT * FROM tbl;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

接下来,在tbl表中插入一个新行:

INSERT INTO tbl(col) VALUES(20);

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

来自第二个会话的插入操作处于等待状态,因为第一个会话READ已经在tbl表上获取了锁,但尚未释放。

可以从SHOW PROCESSLIST查看详细信息。

SHOW PROCESSLIST;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

之后,返回第一个会话并使用UNLOCK TABLES语句释放锁定。READ从第一个会话释放锁定后,INSERT执行第二个会话中的操作。

unlock tables;

最后,检查tbl表的数据,看看INSERT第二个会话的操作是否真的执行了。

SELECT * FROM tbl;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

写锁

WRITE 锁具有以下特点:

  • 保存表锁的唯一会话可以从表中读取和写入数据。
  • 在WRITE锁定释放之前,其他会话无法从表中读取数据并将数据写入表中。

首先,WRITE从第一个会话中获取锁定。

LOCK TABLE tbl WRITE;

然后,在tbl表中插入一个新行

INSERT INTO tbl(col) VALUES(11);

有用。

接下来,从tbl表中读取数据。

SELECT * FROM tbl;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

它也有效。

之后,从第二个会话开始,尝试写入和读取数据:

INSERT INTO tbl(col) VALUES(21);
 
SELECT * FROM tbl;

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

最后,从第一个会话中释放锁定。

UNLOCK TABLES;

看到第二个会话中的所有待处理操作都已执行,下图说明了结果:

MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法

读锁与写锁 读锁是“共享”锁,它可以防止正在获取写锁,但不能锁定其他读锁。写锁是“独占”锁,可以防止任何其他类型的锁。

到此这篇关于SQL中表锁定(LOCK、UNLOCK)的具体使用的文章就介绍到这了!

MySQL 相关文章推荐
MySQL Router的安装部署
Apr 24 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL约束超详解
Sep 04 MySQL
分享mysql的current_timestamp小坑及解决
Nov 27 MySQL
MySQL 开窗函数
Feb 15 MySQL
面试中老生常谈的MySQL问答集锦夯实基础
Mar 13 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL三种方式实现递归查询
Apr 18 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL聚簇索引和非聚簇索引的区别详情
Jun 14 MySQL
Mysql数据库group by原理详解
Jul 07 MySQL
为什么MySQL8新特性会修改自增主键属性
SQL语句多表联合查询的方法示例
Apr 18 #MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 #MySQL
MySQL三种方式实现递归查询
Apr 18 #MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Golang连接并操作MySQL
Apr 14 #MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 #MySQL
You might like
php 静态化实现代码
2009/03/20 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
2017/02/18 PHP
CSS+Jquery实现页面圆角框方法大全
2009/12/24 Javascript
Google 静态地图API实现代码
2010/11/19 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
javascript闭包(Closure)用法实例简析
2015/11/30 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
从parcel.js打包出错到选择nvm的全部过程
2018/01/23 Javascript
基于angular6.0实现的一个组件懒加载功能示例
2018/04/12 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
python文件写入write()的操作
2019/05/14 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Crocs卡骆驰洞洞鞋日本官方网站:Crocs日本
2016/08/25 全球购物
法国体育用品商店:GO Sport
2019/10/23 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
C#基础面试题
2016/10/17 面试题
vue实现倒计时功能
2021/03/24 Vue.js
管理站站长岗位职责
2013/11/27 职场文书
志愿者活动总结范文
2014/04/26 职场文书
环保建议书400字
2014/05/14 职场文书
会计稽核岗位职责
2015/04/13 职场文书
教学质量月活动总结
2015/05/11 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
如何在pycharm中快捷安装pip命令(如pygame)
2021/05/31 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python