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锁具有以下特点:

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

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

SELECT CONNECTION_ID();


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

INSERT INTO tbl(col) VALUES(10);

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

SELECT * FROM tbl;


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

LOCK TABLE tbl READ;

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

INSERT INTO tbl(col) VALUES(11);


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

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

SELECT CONNECTION_ID();


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

SELECT * FROM tbl;


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

INSERT INTO tbl(col) VALUES(20);


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

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

SHOW PROCESSLIST;


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

unlock tables;

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

SELECT * FROM tbl;

写锁

WRITE 锁具有以下特点:

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

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

LOCK TABLE tbl WRITE;

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

INSERT INTO tbl(col) VALUES(11);

有用。

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

SELECT * FROM tbl;

它也有效。

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

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


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

UNLOCK TABLES;

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

读锁与写锁

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

SQL语法——表锁定(LOCK、UNLOCK)相关推荐

  1. SQL Server数据库表锁定原理以及如何解除表的锁定转

    1. 数据库表锁定原理 1.1 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据. 1.2 事务的 ...

  2. SQL Server数据库表锁定原理以及如何解除表的锁定

    1. 数据库表锁定原理 1.1 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据. 1.2 事务的 ...

  3. sql delete删除两个表_超强干货!SQL语法大合集

    本文针对关系型数据库的一般语法.限于篇幅,本文侧重说明用法,不会展开讲解特性.原理. 1 基本概念 数据库术语 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件) 数据表( ...

  4. SQL语法精讲(包括建库、建表、建视图、查询、增加、删除、修改)

    SQL语法精讲(包括建库.建表.建视图.查询.增加.删除.修改) SQL分类: DDL-数据定义语言(CREATE,ALTER,DROP,DECLARE) DML-数据操纵语言(SELECT,DELE ...

  5. SQL语法(五) 多表联合查询

    前言 当需要获取的数据分布在多张中,考虑使用联合查询,本章将学习两种查询方式(sql92/sql99) 范例 1.笛卡儿积 将多个表的数据进行一一对应,所得到结果为多表的笛卡尔积.结果的数量为所有表的 ...

  6. mysql语法大全w3school_(二)mysql:在w3schools文档上学习sql语法(使用数据库创建一张表)...

    1.选中要使用的数据库(选中上篇创建的test数据库) 现有的数据库 mysql>use test; 则选中test数据库: 2.创建一张表 2.1column代表每一列的名称,datatype ...

  7. SQL多表查询基本语法与实例

    多表查询就是在一条查询语句中,从多张表里一起取出所需的数据,如果要想进行多表查询,直接在FROM子句之后跟上多个表即可,此时的语法如下: select [DISTINCT]*|列名称[AS][列别名] ...

  8. 导学+初识MySQL+SQL语法规范+数据库相关操作+表相关操作+MySql存储引擎介绍+MySQL表的创建+测试数据类型

    一.导学 1.什么是SQL? 结构化查询语言,数据库管理系统通过SQL语言来管理数据库中的数据: 2.SQL语言组成部分 (1)DDL--数据定义语言,主要定义数据库.表.视图.索引和触发器等 (2) ...

  9. SQL语法笔记和常用技巧收集

    执行顺序 (1)FROM [left_table] (2)ON <join_condition> (3)<join_type> JOIN <right_table> ...

最新文章

  1. 突发!这个操作系统竟比macOS还火
  2. 源码群友问:你这么多项目是怎么进行技术选型的?
  3. MongoDb连接表的查询
  4. RHadoop(一)
  5. 计算机视觉方向简介 | 多视角立体视觉MVS
  6. windows切换桌面的快捷键
  7. HDU 3533 简单bfs 主要是MLE问题
  8. 输血和输血反应题库【1】
  9. 开源项目zheng运行环境
  10. 与世界有怎样的关系,便拥有了怎样的自己
  11. 服务器连接异常系统无法登录,Win10系统电脑无法登录LOL提示服务器连接异常的原因及解决方法...
  12. 马桶品牌十大排名榜2022 马桶什么牌子好又实惠
  13. python的培训学校
  14. C语言查询ask码的函数,ask码(字符转成ascii码)
  15. AppRTC服务器搭建
  16. 使用nginx配置一个ip对应多个域名
  17. 计算机网络实验以太网帧分析,实验二 用Ethereal捕获并分析以太网帧格式
  18. 小米3刷android 6.0,小米3/4/Note适配Android6.0刷机包链接 注意事项及提取密匙
  19. [原创]个人收集有关计算机视觉和模式识别相关的网址
  20. Android 10 系统屏蔽底部按键 禁止锁屏 禁用横屏

热门文章

  1. C#从入门到入坟(原创不易,转载请注明出处)
  2. UITextField shouldChangeCharactersInRange获取实时数据并执行联想搜索和搜索
  3. 婚姻是夫妻之间相互取悦
  4. 2020年学计算机需要什么配置,开学装机:2020年如何配一台5000元主流配置的游戏主机?...
  5. 视频教程-快速入门Python基础教程_Python基础进阶视频-Python
  6. css清除浮动的最好的方式和原因
  7. 正交表方法在创建测试套件上的应用(2)
  8. 图论(三):哈密顿图与哈密顿回路
  9. python特性高移植性_用户选择使用Python的原因有哪些
  10. 如何用Stata完成(shui)一篇经济学论文(十五):平行性趋势检验与安慰剂检验