MySQL行锁核心知识介绍

news2024/12/26 21:16:10

        MySQL的行锁是数据库中用于控制并发访问的一种机制。它允许在数据库的行级别上实现锁定,从而允许多个事务同时修改不同行的数据,而不会相互干扰。这种锁机制可以提高数据库的并发性能,减少锁争用,提高事务的吞吐量。在本教程中,我们将深入探讨MySQL行锁的核心知识,包括其特点、工作原理以及如何使用它来保证事务的隔离性和一致性。


        1. 行锁的特点
        行锁具有以下特点:
- **粒度小**:行锁锁定的是数据表中的具体行,而不是整个表或页。这意味着在同一时间内,不同的事务可以同时修改不同的行,从而提高了并发性。
- **锁定资源少**:由于锁定的是具体的行,因此锁定的资源比表锁或页锁少,减少了锁争用的可能性。
- **冲突少**:行锁减少了事务之间的冲突,因为它们通常只锁定它们需要的数据行。
- **死锁风险**:由于行锁是在事务执行过程中动态获取的,因此存在死锁的风险。死锁是指两个或多个事务在等待对方释放锁时无限期地阻塞。
        2. 行锁的工作原理
        MySQL使用多种类型的行锁,包括共享锁(S锁)和排他锁(X锁):
- **共享锁(S锁)**:允许事务读取一行数据,但不允许其他事务修改它。共享锁不会阻止其他事务获取同一行的共享锁。
- **排他锁(X锁)**:允许事务读取和修改一行数据,但不允许其他事务获取该行的任何类型的锁。
        当事务需要修改一行数据时,它会尝试获取该行的排他锁。如果成功,其他事务将无法读取或修改该行,直到锁被释放。当事务只需要读取一行数据时,它会获取该行的共享锁,允许多个事务同时读取同一行数据。
        3. 行锁的实现
        MySQL的行锁是通过存储引擎实现的。不是所有的存储引擎都支持行锁。例如,MyISAM存储引擎只支持表锁,而InnoDB存储引擎支持行锁。InnoDB是MySQL中最常用的存储引擎之一,它通过在索引记录上设置锁来实现行锁。
        4. 死锁的处理
        由于行锁是在事务执行过程中动态获取的,因此可能会发生死锁。MySQL的InnoDB存储引擎通过以下机制来处理死锁:
- **超时机制**:InnoDB允许为行锁设置超时时间。如果一个事务在等待获取锁时超过了超时时间,则会回滚该事务,并释放它持有的所有锁。
- **死锁检测**:InnoDB会定期检查是否存在死锁。如果检测到死锁,它会选择一个牺牲者事务并回滚它,以解除死锁。
        5. 使用行锁的简单例子
        假设我们有一个名为`employees`的表,其中包含列`id`、`name`和`salary`。我们想要更新特定员工的薪水,同时确保其他事务不能同时修改同一员工的记录。


-- 事务1
START TRANSACTION;
SELECT * FROM employees WHERE id = 1 FOR UPDATE; -- 获取排他锁
UPDATE employees SET salary = salary * 1.1 WHERE id = 1;
COMMIT;
-- 事务2
START TRANSACTION;
SELECT * FROM employees WHERE id = 1 FOR UPDATE; -- 等待事务1释放锁
UPDATE employees SET salary = salary * 1.2 WHERE id = 1;
COMMIT;


        在这个例子中,事务1首先获取了id为1的员工的排他锁,然后更新了该员工的薪水。事务2尝试获取同一行的排他锁,但由于事务1尚未提交,它必须等待。一旦事务1提交,事务2就可以获取锁并继续执行。
        6. 总结
        MySQL的行锁是一种强大的机制,用于在数据库中实现高并发控制。它通过在行级别上锁定数据,允许多个事务同时访问不同的数据行,从而提高了数据库的并发性能。然而,行锁也带来了死锁的风险,需要通过超时机制和死锁检测来处理。了解行锁的工作原理和使用方法是设计和实现高效、安全的事务的关键。随着MySQL的不断发展和优化,行锁机制也在不断完善,为用户提供更好的性能和可靠性。

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

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

相关文章

一周学会Django5 Python Web开发-Jinja3模版引擎-安装与配置

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计35条视频,包括:2024版 Django5 Python we…

.Net Core 中间件验签

文章目录 为什么是用中间件而不是筛选器?代码实现技术要点context.Request.EnableBuffering()指针问题 小结 为什么是用中间件而不是筛选器? 为什么要用中间件验签,而不是筛选器去验签? 1、根据上图我们可以看到,中间件在筛选器之…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令(1)Edge(2)Chrome 2. 执行python代码(1)先启动浏览器后执行代码(2)通过代码启动浏览器(3)Bug问题记录1&#xff…

前端和后端权限控制【笔记】

前端权限设置【笔记】 前言版权推荐前端权限设置需求效果实现资源 后端权限控制1.给所有前端请求都携带token2.添加拦截器3.配置到WebMvcConfiguration4.更多的权限验证 最后 前言 2024-3-15 18:27:26 以下内容源自《【笔记】》 仅供学习交流使用 版权 禁止其他平台发布时删…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FormLink)

提供静态卡片交互组件,用于静态卡片内部和提供方应用间的交互,当前支持router、message和call三种类型的事件。 说明: 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件仅可…

Gitlab CI/CD 自动化打包部署前端(vue)项目

一、虚拟机安装 1.vmware下载 2.镜像下载 3.Ubuntu 4.新建虚拟机 一直点下一步,直到点击完成。 5.分配镜像 二、Gitlab CI/CD 自动化部署项目 1.配置GitLab CI/CD: A.在你的Vue.js项目中,创建一个名为.gitlab-ci.yml的文件&#xff0…

Javaweb--CSS

一:概述 CSS (Cascading Style Sheet(层叠样式表))是一门语言,用于控制网页表现。 W3C标准规定了网页是由以下组成: 结构:HTML 表现:CSS 行为:JavaScrip…

【计算机网络】UDP/TCP 协议

TCP 协议 一、传输层1. 再谈端口号2. 端口号范围划分3. 进程和端口号4. netstat5. pidof 二、UDP 协议1. UDP 协议端格式(报文)2. UDP 的特点3. 面向数据报4. UDP 的缓冲区 三、TCP 协议1. 认识 TCP2. TCP 协议段格式(1)4 位首部长度(2&#…

(三)丶RabbitMQ的四种类型交换机

前言:四大交换机工作原理及实战应用 1.交换机的概念 交换机可以理解成具有路由表的路由程序,仅此而已。每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型&a…

用真值表、逻辑表达式和卡诺图来表示数字电路中的逻辑关系

真值表(Truth Table) 真值表是一种直观的方式,通过列出所有可能的输入值及其对应的输出值来表示逻辑关系。以下是使用真值表表示逻辑关系的步骤: 1. 确定输入变量:列出数字电路中所有的输入变量。 2. 定…

CART决策树暴力生成风控规则(Python代码)

上一篇我们介绍了决策树节点信息更新的方法风控规则的决策树可视化(升级版),以辅助我们制定风控规则,可视化的方法比较直观,适合做报告展示,但分析的时候效果没那么高。 本篇我们介绍一种通过决策树自动挖…

基于openresty构建运维工具链实践

本文字数:4591字 预计阅读时间:25 01 导读 如今OpenResty已广泛被各个互联网公司在实际生产环境中应用,在保留Nginx高并发、高稳定等特性基础上,通过嵌入Lua来提升在负载均衡层的开发效率并保证其高性能。本文主要介绍接口鉴权、流…

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合: 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…

D-泛醇(右泛醇)应用领域广泛 我国市场参与者众多

D-泛醇(右泛醇)应用领域广泛 我国市场参与者众多 D-泛醇又称右泛醇、原维生素B5,化学式为C9H19NO4,为泛醇的右旋异构体。D-泛醇外观呈无色粘稠或透明液体,微含臭味,可溶于甲醇、乙醇、水和丙二醇。D-泛醇综…

react native 实现自定义底部导航与路由文件配置

首先先把需要的一些库引入 yarn install react-navigation/native yarn install react-native-screens react-native-safe-area-context yarn install react-navigation/native-stack yarn add react-navigation/bottom-tabs 创建路由文件及四个底部导航页面 router文件下的bot…

MATLAB:一些杂例

a 2; b 5; x 0:pi/40:pi/2; %增量为pi/40 y b*exp(-a*x).*sin(b*x).*(0.012*x.^4-0.15*x.^30.075*x.^22.5*x); %点乘的意义 z y.^2; %点乘的意义 w(:,1) x; %组成w,第一列为x w(:,2) y; %组成w,第二列为y w(:,3) z; %组成w,第三列为z…

大规模C++程序设计 -- 基本规则

文章目录 基本规则概述成员数据访问全局命名空间全局数据自由函数枚举类型、typedef和常量数据预处理宏头文件中的名称 包含卫哨包含冗余卫哨文档标识符命名规则 基本规则 概述 任何精美的艺术不仅来源于创造,而且来自于规范。编程也是如此。C是易总大型语言&…

【New Release】PostgreSQL小版本(16.2, 15.6, 14.11, 13.14,12.18) 发布了

前言 PostgreSQL遵循小版本的发布规律,这一个季度的小版本又发布了。可以算作是2024年第一个季度的版本发布。如果总结其规律:大概就是2月、5月、8月、11月的样子。通常因为11月配合大版本的发布,它是起点,也有可能就是终点。起点…

【Docker篇】自定义Dockerfile的操作

文章目录 🍔镜像结构🛸什么是Dockerfile⭐基于Ubuntu镜像构建一个新镜像,运行一个java项目🔎使用 java:8-alpine 🍔镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例&am…

Vintage账龄分析表计算底层逻辑(Python实操)

大家好,我是东哥。 信贷风控领域中,经常用到账龄Vintage报表,这是入门初学者的难点之一,因为它涉及到用户还款、逾期等多种行为以及业务上的多种统计口径,因此很多朋友一直无法将逻辑梳理清楚。本次来给大家详细介绍V…