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学习笔记之事务隔离级别详解
May 12 MySQL
详解MySQL的Seconds_Behind_Master
May 18 MySQL
分析MySQL抛出异常的几种常见解决方式
May 18 MySQL
Mysql 用户权限管理实现
May 25 MySQL
Mysql基础知识点汇总
May 26 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
MySQL数据库索引的最左匹配原则
Nov 20 MySQL
MySQL数据库如何给表设置约束详解
Mar 13 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL中一条SQL查询语句是如何执行的
Apr 08 MySQL
mysql序号rownum行号实现方式
Dec 24 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/08/05 PHP
php入门教程 精简版
2009/12/13 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP7标量类型declare用法实例分析
2016/09/26 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
用于节点操作的API,颠覆原生操作HTML DOM节点的API
2010/12/11 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
javascript限制文本框输入值类型的方法
2015/05/07 Javascript
如何在Angular.JS中接收并下载PDF
2016/11/26 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
vue二级路由设置方法
2018/02/09 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
jQuery扩展方法实现Form表单与Json互相转换的实例代码
2018/09/05 jQuery
微信小程序实现留言板功能
2018/11/02 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
js笔试题-接收get请求参数
2019/06/15 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
python中的colorlog库使用详解
2019/07/05 Python
详解numpy.meshgrid()方法使用
2019/08/01 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
Python从MySQL数据库中面抽取试题,生成试卷
2021/01/14 Python
CSS3改变浏览器滚动条样式
2019/01/04 HTML / CSS
基于CSS3的animation属性实现微信拍一拍动画效果
2020/06/22 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
英语自荐信常用语句
2013/12/13 职场文书
新闻传媒系求职信范文
2014/04/19 职场文书
社区志愿者活动方案
2014/08/18 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
关于的python五子棋的算法
2022/05/02 Python