mysql如何加行锁

一、概述

InnoDB 引擎是支持行级锁的,而 MyISAM 引擎并不支持行级锁,所以后面的内容都是基于 InnoDB 引擎的。当我们使用delete、update进行数据库删除、更新的时候,数据库会自动加上行锁。但是,行锁有时也会失效。
数据库版本:8.0.32。

二、InnoDB锁类型

InnoDB一共有四种锁:共享锁(读锁/S锁)、排他锁(写锁/X锁)、意向共享锁(IS锁)和意向排他锁(IX锁)。其中共享锁与排他锁属于行级锁,另外两个意向锁属于表级锁。

共享锁(读锁/S锁):若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放S锁。
排他锁(写锁/X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务不能再对A加作何类型的锁,直到T释放A上的X锁。
意向共享锁(IS锁):事务T在对表中数据对象加S锁前,首先需要对该表加IS(或更强的IX)锁。
意向排他锁(IX锁):事务T在对表中的数据对象加X锁前,首先需要对该表加IX锁。
比如:

SELECT ... FROM T1  LOCK IN SHARE MODE

语句首先会对表T1加IS锁,成功加上IS锁后才会对数据加S锁。

同样,

SELECT ... FROM T1  FOR UPDATE

语句首先会对表T1加IX锁,成功加上IX锁后才会对数据加X锁。

三、mysql加行锁的方法:

  • 1.select … for update
    对读取的记录加独占(排他)锁;

  • 2.select … lock in share mode
    对读取的记录加共享锁;

  • 3.使用delete
    自动加独占锁;

  • 4.使用update
    自动加独占锁;

锁的规则:
共享锁(S锁)满足读读共享,读写互斥。独占锁(X锁)满足写写互斥、读写互斥。

四、行级锁种类:

  • 1.读已提交隔离级别下,行级锁的种类只有 记录锁
    简单来说,就是把数据表中的某条记录锁住;

  • 2.在可重复读隔离级别下,行级锁的种类除了有记录锁,还有间隙锁(目的是为了避免幻读),所以行级锁的种类主要有三类:

第一种:
Record Lock,记录锁,也就是仅仅把一条记录锁上;
记录锁包括:共享锁和独占锁。

第二种:
Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
间隙锁之间是相互兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系。

第三种:
Next-Key Lock 临键锁:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。

  • 何时使用行锁,何时产生间隙锁?
    1.只使用唯一索引查询,并且只锁定一条记录时,innoDB会使用行锁。
    2.只使用唯一索引查询,但是检索条件是范围检索,或者是唯一检索但检索结果不存在(试图锁住不存在的数据)时,会产生 Next-Key Lock(临键锁)。
    3.使用普通索引检索时,不管是何种查询,只要加锁,都会产生间隙锁(Gap Lock)。
    4.同时使用唯一索引和普通索引时,由于数据行是优先根据普通索引排序,再根据唯一索引排序,所以也会产生间隙锁。

开启mysql(8.0.32)命令行窗口,开启事务执行加锁:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> update t_run_work_order set work_title='' where id='7742';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

查看加锁情况:

mysql> select * from performance_schema.data_locks;
+--------+-----------------------------------------+-----------------------+-----------+----------+---------------+------------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| ENGINE | ENGINE_LOCK_ID                          | ENGINE_TRANSACTION_ID | THREAD_ID | EVENT_ID | OBJECT_SCHEMA | OBJECT_NAME      | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_MODE     | LOCK_STATUS | LOCK_DATA |
+--------+-----------------------------------------+-----------------------+-----------+----------+---------------+------------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
| INNODB | 140295790075904:1271:140295710762800    |              80343359 |      2548 |      225 | sfms-efms     | t_run_work_order | NULL           | NULL              | NULL       |       140295710762800 | TABLE     | IX            | GRANTED     | NULL      |
| INNODB | 140295790075904:213:6:2:140295710759696 |              80343359 |      2548 |      225 | sfms-efms     | t_run_work_order | NULL           | NULL              | PRIMARY    |       140295710759696 | RECORD    | X,REC_NOT_GAP | GRANTED     | 7742      |
+--------+-----------------------------------------+-----------------------+-----------+----------+---------------+------------------+----------------+-------------------+------------+-----------------------+-----------+---------------+-------------+-----------+
2 rows in set (0.00 sec)

字段说明:


ENGINE 表使用的存储引擎,这里是InnoDB
ENGINE_TRANSACTION_ID 事务ID
OBJECT_SCHEMA 加锁的表空间,这里的表空间是test
OBJECT_NAME 加锁的表名,这里是user
INDEX_NAME 加锁的索引名称,表级锁为null,行级锁为加锁的索引名称。这里PRIMARY表示是主键索引上添加锁。
LOCK_TYPE 锁类型:TABLE对应表级锁,RECORD对应行级锁。
LOCK_MODE 加锁模式,对应具体锁的类型,比如:IX 意向排他锁,X,GAP 排他间隙锁。
LOCK_STATUS 锁的状态,GRANTED 已获取,WAITING 等待中
LOCK_DATA 加锁的数据,这里的7742表示,在主键索引值为7742的记录上加锁。由于加的是记录锁,这里锁定的主键值为7742的记录。
 

LOCK_MODE 加锁模式:

在这里插入图片描述

五、行锁失效

如果where条件中没有使用索引或者索引失效,行锁会升级为表锁,此时,相当于行锁失效,对数据表进行操作时,会锁住整张表。下一篇,我们再讨论索引失效的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/15501.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记:计算机网络体系结构(OSI七层模型、TCP/IP五层协议)

计算机网络体系结构 计算机网络是一个复杂的、具有综合性技术的系统,它由计算机系统、通信处理机、通信线路和通信设备、操作系统以及网络协议等组成。为了更好地描述计算机网络结构,使计算机网络系统有条不紊地处理工作,需要定义一种较好的…

CH9121网络串口透传应用

概述 随着物联网技术的普及,越来越多的传统设备出现联网功能需求。串口作为使用较为广泛的一种通信接口,串口转以太网,进行远程数据传输需求逐渐显现出来。CH9121内部集成TCP/IP协议栈,无需编程,即可轻松实现网络数据…

【SWAT水文模型】SWAT水文模型建立及应用第二期:土地利用数据的准备

SWAT水文模型建立及应用:土地利用数据的准备 1 简介2 土地利用数据的下载2.1 数据下载方式2.1.1 中科院1km土地利用数据2.1.2 清华大学高精度土地利用数据 2.2 数据下载 3 土地利用数据的准备3.1 矢量转栅格3.2 土地利用类型的重分类3.3 土地利用分布图投影调整3.4 …

【LeetCode】213. 打家劫舍 II

213. 打家劫舍 II(中等) 思路 这道题是 198.打家劫舍 的拓展版,区别在于:本题的房间是环形排列,而198.题中的房间是单排排列。 将房间环形排列,意味着第一间房间和最后一间房间不能同时盗窃,因…

EPIT定时器实验(一)

EPIT定时器简介 EPIT:Enhanced Periodic Interrupt Timer,直译就是增强的周期中断定时器,它主要完成周期性中断定时的。 STM32里面的定时器有很多其它功能,比如输入捕获、PWM输出等,但是I.MX6U的的EPIT定时器只是完成…

【五一创作】数据可视化之美 ( 三 ) - 动图展示 ( Python Matlab )

1 Introduction 在我们科研学习、工作生产中,将数据完美展现出来尤为重要。 数据可视化是以数据为视角,探索世界。我们真正想要的是 — 数据视觉,以数据为工具,以可视化为手段,目的是描述真实,探索世界。 …

CSS布局之圣杯布局/双飞翼布局

📝个人主页:爱吃炫迈 💌系列专栏:HTMLCSS 🧑‍💻座右铭:道阻且长,行则将至💗 文章目录 圣杯布局HTML代码步骤CSS代码 双飞翼布局HTML代码步骤CSS代码 小结 圣杯布局 HTM…

Java --- springboot2的静态资源配置原理

目录 一、静态资源配置原理 1.1、配置类只有一个有参构造器 1.2、资源处理的默认规则 1.3、欢迎页的处理规则 一、静态资源配置原理 springboot启动默认加载xxxAutoConfiguration(自动配置) springmvc功能的自动配置类,生效 Configuration(proxyBeanMethods …

《编码——隐匿在计算机软硬件背后的语言》精炼——第13-14章(二进制减法器——1位存储器)

“成功不是最终的,失败不是致命的,勇气才是最关键的。” - 温斯顿丘吉尔 文章目录 如何实现减法计算机进行减法运算的逻辑借位的代替机制二进制下的替代机制 减法的电路实现 反馈与触发器电铃触发器R-S触发器 电平触发的D型触发器 如何实现减法 计算机进…

霍兰德人格分析雷达图

雷达图 Radar Chart 雷达图是多特性直观展示的重要方式 问题分析 霍兰德认为:人格兴趣与职业之间应有一种内在的对应关系 人格分类:研究型、艺术型、社会型、企业型、传统型、现实性 职业:工程师、实验员、艺术家、推销员、记事员、社会工…

1992-2022年31省人均gdp/各省人均地区生产总值

1992-2022年31省人均gdp/各省人均地区生产总值 1、时间:1992-2022年 2、来源:国家统计J、各省NJ 3、范围:包括31省 4、缺失情况说明:无缺失 5、指标包括:各省人均GDP/省人均地区生产总值 6、指标解释&#xff1a…

五一劳动节前 特辑 ,路上那些车不能碰 你赔不起系列

相信明天大家4月29日都上了高速,都奔赴自己今年第一个想去的地方,那么上了高速,见的车辆就多了,哪些车辆我们要明白,尽量不要去碰,或者看见进行 技术性躲避,因为碰一下,半套房没了&a…

Vue3超详细的ref()用法,看这一篇就够了

ref()接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的,即可以为 .value 赋予新的值 举例: c…

【chatgpt】学习开源项目chatgpt-web,搭建自己的chatgpt服务,功能非常丰富有打字效果

目录 前言1,开源的chatgpt项目2,项目可以直接使用docker-compose跑起来3,关于打字模式SSE, octet-stream (打字特效)4,关于内容存储5,总结 前言 本文的原文连接是: https://blog.csd…

线性结构的存储类型

线性结构的存储类型 顺序标:顺序标就是数组,也成为向量vector、高维向量及称为张量即tensor 链表:单链表、双链表、循环链表 线性表概念 表目、文件、索引、表的长度、空表 线性表由节点表和关系表组成二元组; 节点集由有限的…

Hadoop 1:Apache Hadoop、HDFS

Hadoop核心组件 Hadoop HDFS(分布式文件存储系统):解决海量数据存储 Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度 Hadoop MapReduce(分布式计算框架):解决…

全景丨0基础学习VR全景制作,平台篇第13章:热点功能-总览介绍

全景丨0基础学习VR全景制作,平台篇第13章:热点功能-总览介绍 大家好,欢迎观看蛙色VR官方——后台使用系列课程! 一、热点功能概览 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的…

关于电信设备进网许可制度若干改革举措的通告

Q:3月1日后,不再实行进网许可管理的11种电信设备是否还需要继续申请和使用标志? A:3月1日起,对不再实行进网许可管理的11种电信设备停止核发进网许可标志,已申请的标志可在证书有效期内继续使用。 Q&#…

Linux shell编程 条件语句if case

条件测试 test命令 测试表达式是否成立,若成立返回0,否则返回其他数值 格式1: test 条件表达式 格式2: [ 条件表达式 ]文件测试 [ 操作符 文件或者目录 ][ -e 1.txt ]#查看1.txt是否存在,存在返回0 echo $? #查看是上一步命令执行结果 0成…

mysql语句高级用法使用记录和sql_mode=only_full_group_by错误解决

最近工作时用到的几种用法记录一下 sql_modeonly_full_group_by 报错 sql出错示例如下 column ‘qnaq.ta.issue_org_code’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 原因分析:…