mysql如何加行锁

news2024/12/23 10:44:33

一、概述

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 的组合,锁定一个范围,并且锁定记录本身。

开启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条件中没有使用索引或者索引失效,行锁会升级为表锁,此时,相当于行锁失效,对数据表进行操作时,会锁住整张表。下一篇,我们再讨论索引失效的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

正则表达式 - 边界

目录 一、零宽断言 二、行的开始和结束 1 . ^ 与 $ 2. dotall 模式 三、单词边界和非单词边界 1. 统计某个单词出现的次数 2. 统计单词个数 四、主题词的起始与结束位置 五、使用元字符的字面值 六、在段首加标签 一、零宽断言 断言(assertions&#xff0…

颜色选择器vue3-colorpicker

其他选择器:一款支持vue3 的颜色选择器 | ColorPickerV3基于vue3的颜色选择器支持颜色透明度与rgba、hexhttps://colorpickerv3.wcrane.cn/guide/#%E7%89%B9%E7%82%B9 这个选择器也挺好看的, 只是貌似不能外部打开选择器面板 官网:Webpack Ap…

第五章:多表查询

一、笛卡尔积的多表查询 1.案例 查询员工名为’Abel’的员工在哪个城市工作? 2.出现笛卡尔积(交叉连接)的错误 select employee_id, department_name from employees,departments为什么出现2889条记录? Employees 107 Departments 27 …

Python 一元线性回归模型预测实验完整版

一元线性回归预测模型 实验目的 通过一元线性回归预测模型,掌握预测模型的建立和应用方法,了解线性回归模型的基本原理 实验内容 一元线性回归预测模型 实验步骤和过程 (1)第一步:学习一元线性回归预测模型相关知识。 线性回归模型属于…

如何高质量的提问题让chatgpt更明白我们的意图

如何更好地向 ChatGPT 提问 ChatGPT是一款基于深度学习的人工智能语言模型,用户可以通过文本输入向其提问并获得自然语言回答。以下是如何更好地向ChatGPT提问的几个建议: 确定问题类型。ChatGPT的训练数据源广泛,支持各种类型的问题&#x…

[INFOCOM 2019] NeuralWalk:使用神经网络的在线社交网络中的信任评估

NeuralWalk: Trust Assessment in Online Social Networks with Neural Networks | IEEE Conference Publication | IEEE Xplore 摘要: 评估信任社交网络(TSN)中用户之间的信任是许多应用中的关键问题,例如电影推荐,…

buuctf5

目录 [极客大挑战 2019]BabySQL [极客大挑战 2019]PHP 神秘龙卷风 假如给我三天光明 后门查杀 webshell后门 [极客大挑战 2019]BabySQL 1. 发现存在sql注入 2.使用bp用fuzz字典爆破一下哪些词被过滤了,发现or,select等都被过滤了 尝试双写注入 3.…

Vue.js 框架能力的官方认证

这两天Vue官方推出了Vue.js 认证计划。 即框架能力官方认证,即 Vue.js 框架能力证书。该认证由 Vue School 与 Vue.js 团队合作提供支持。官网:Vue.js - Official Certification Program 官方介绍此次的试题集和代码挑战由 Vue.js 核心团队审核&#xff…

docker 安装 datax和datax-web 之 datax-web登录时提示账号或密码错误

docker 安装docker 安装 datax和datax-web 安装教程地址: https://www.cnblogs.com/leihongnu/p/16612273.html 根据该博客的教程安装成功后,登录页面能打开,但是所提供的账户密码一直报错,这个就需要根据日志一步步去寻找原因了…

《编程思维与实践》1037.一元多项式乘法

《编程思维与实践》1037.一元多项式乘法 题目 思路 比较容易想到将步骤分为三步: 1.读取多项式每项的系数(coefficient)和对应的指数(dim); 2.进行多项式乘法; 3.输出进行多项式乘法后的非零项系数. 其中多项式乘法可以通过循环来处理,输出可以用if来判断系数是否为0,需要考虑…

多重共线性问题如何解决?

​ 一、多重共线性说明 多重共线性一般是指:如果有两个或者多个自变量高度相关(相关系数大于0.8),难以区分一个自变量对因变量的影响和作用,将自变量相关性产生的后果定义为多重共线性,一般提出多重共线性…

Pytorch 安装

Pytorch PyTorch介绍 特点: 1.简单易用、分布式训练、服务器部署方便、移动端部署方便; 2.PyTorch 是基于以下两个目的而打造的python科学计算框架: 无缝替换NumPy,并且通过利用GPU的算力来实现神经网络的加速。 3.通过自动…

ubuntu-18.0.04 鸿蒙OpenHarmony系统源码(OHSP)下载

如果想下载HarmonyOS中 api7里面的java 源码的,可以止步了。因为这一块并没有开源,api 7里面java的部分属于HarmonyOS,不是openharmony的部分… 怪不得网上找不到任何一个介绍Ability.java AbilitySlice.java这种源代码的文章。java应该只是鸿…

Cilium架构简介eBPF数据流向查看

1 环境准备 上一篇文章将 k8s 的网络插件改为 cilium 同时部署了观测平台 hubble,部署方式可参考上篇。 基于eBPF的k8s网络插件Cilium部署与流量治理浅尝 本篇讲一下 cilium 的架构和数据流向的查看方式。首先,你需要一个kubernetes集群,并使…

算法记录 | Day43 动态规划

1049.最后一块石头的重量 II 思路: 本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了。 本题物品的重量为stones[i],物品的价值也为stones[i]。 对应着01背包里的物品重量weight[i…

[学习笔记] [机器学习] 3. KNN( K-近邻算法)及练习案例

视频链接数据集下载地址:《3. KNN及练习案例》配套数据集 1. K-近邻算法(KNN)概念 学习目标: 掌握K-近邻算法实现过程知道K-近邻算法的距离公式知道K-近邻算法的超参数 K K K值以及取值问题知道kd树实现搜索的过程应用KNeighborsClassifier实现分类知…

什么是ERP?可能是全网最权威的解读

ERP的概念定义 ERP是企业资源规划的简称。要理解ERP是什么,最简单的方法是先思考企业正常运营需要的核心业务流程,如财务、HR、制造、供应链、服务、采购等,而 ERP系统最基础的功能就是帮助企业在集成式系统中高效管理这些流程。因为 ERP 系…

烟火识别智能监测系统 yolov5

烟火识别智能监测系统基于pythonyolov5网络模型算法智能分析技术,烟火识别智能监测算法模型对现场画面进行实时分析,发现现场出现烟火立即抓拍实时告警。我们选择当下卷积神经网络YOLOv5来进行火焰识别检测。6月9日,Ultralytics公司开源了YOL…

Day956.代码现代化 -遗留系统现代化实战

代码现代化 Hi,我是阿昌,今天学习记录的是关于代码现代化的内容。 代码现代化的主要模式。 大体的脉络是这样的: 先对代码做可测试化重构,并添加测试;在测试的保护下,安全地重构;在测试的保…

数据链路层相关知识

文章目录 一.数据链路层简介二.MAC地址为什么有了ip地址,我们还要使用mac地址呢? 三.以太网什么是以太网以太网封装帧格式认识MTU谈谈 MTU对IP协议的影响. 一.数据链路层简介 数据链路层的位置和角色:位于物理层和网络层之间,负责实现两个直接相连的节点(主机/路由器)之间的可…