Mysql数据库的锁机制

MySQL 中的锁可以按照粒度分为锁定整个表的表级锁(table-level locking)和锁定数据行的行级锁(row-level locking)表级锁开销小,加锁快,但是支持的并发度低,行级锁相反。

行锁

Innodb实现了以下两种类型的行锁

  • 共享锁(S):允许获得该锁的事务读取数据行(读锁),同时允许其他事务获得该数据行上的共享锁,并且阻止其他事务获得数据行上的排他锁。

  • 排他锁(X):允许获得该锁的事务更新或删除数据行(写锁),同时阻止其他事务取得该数据行上的共享锁和排他锁。

select * from t where id = 1 for share;

在事务中使用select ... for share语句获得了数据行 id = 1 上的共享锁

select * from t where id = 1 for update;

使用select ... for update命令获取排他锁(常用)

InnoDB 通过给索引上的索引记录加锁的方式实现行级锁。具体来说,InnoDB 实现了三种行锁的算法:记录锁(Record Lock)、间隙锁(Gap Lock)和 Next-key 锁(Next-key Lock)又称临键锁。

1. 记录锁(Record Lock)

记录锁是锁定索引记录本身的一种锁。它仅锁定单个行,不会影响其他行或范围。

  • 应用场景: 当一个事务需要修改或读取特定记录时,InnoDB会使用记录锁。

  • 锁定范围: 锁住单行数据。

  • 优点: 粒度细,有利于高并发。

START TRANSACTION;
SELECT * FROM employees WHERE id = 1 FOR UPDATE;
-- This statement locks the row where id = 1 for update.

 

在上述示例中,FOR UPDATE子句会对满足条件的行加上记录锁,以防止其他事务修改该行。

2.间隙锁

间隙锁用于锁定两个索引记录之间的范围,防止其他事务在这个范围内插入新记录。间隙锁的主要目的是防止幻读现象。

  • 应用场景: 当一个事务需要扫描一系列记录并确保该范围内没有其他插入操作时,会使用间隙锁。

  • 锁定范围: 锁住两个记录之间的间隙,但不包括记录本身。

  • 优点: 防止幻读,保证数据一致性。

START TRANSACTION;
SELECT * FROM employees WHERE age BETWEEN 30 AND 40 FOR UPDATE;
-- This statement locks the gap between rows satisfying the condition age BETWEEN 30 AND 40.

 

在上述示例中,FOR UPDATE子句会锁住所有年龄在30到40岁之间的记录之间的间隙,防止其他事务在这些间隙中插入新记录。

3.Next-key锁(Next-key Lock)

第三种就是next-key锁,这个是是记录锁和间隙锁的组合,它锁定一个范围内的记录及其相邻的间隙。Next-key锁是InnoDB默认的锁定方式,用于防止幻读现象,确保数据一致性。

一帮来说范围不用间隙锁而用next-key锁,具体看mysql底层决定

应用场景: 当一个事务需要扫描和锁定某一范围内的所有记录和间隙时,InnoDB会使用Next-key锁。

锁定范围: 锁住记录及其相邻的间隙。

优点: 提供更强的并发控制,防止幻读。

假设 employees 表中有以下数据:

 id | age----------1  | 252  | 303  | 354  | 405  | 45

在执行 SELECT * FROM employees WHERE age BETWEEN 30 AND 40 FOR UPDATE; 时,InnoDB会对满足条件的记录及其相邻的间隙进行加锁。

nex-tkey锁的锁定范围如下:

  1. 记录锁(Record Lock): 锁住 age = 30age = 35age = 40 的记录。

  2. 间隙锁(Gap Lock)

    锁住以下间隙:

    • age = 25age = 30 的间隙。

    • age = 30age = 35 的间隙。

    • age = 40age = 45 的间隙。

表锁
  • InnoDB除了行级锁,还支持有MYSQL服务层实现的表级锁(LOCK TABLES ... WRITE在指定的表加上表级排他锁)

但是当这两种锁存在时,可能会发生冲突

例如,事务 A 获取了表中一行数据的读锁;然后事务 B 申请该表的写锁(例如修改表的结构)。如果事务 B 加锁成功,那么它就应该能修改表中的任意数据行,但是 A 持有的行锁不允许修改锁定的数据行。显然数据库需要避免这种问题,B 的加锁申请需要等待 A 释放行锁。

那么如何判断事务 B 是否应该获取表级锁呢?首先需要看该表是否已经被其他事务加上了表级锁,然后依次查看该表中的每一行是否已经被其他事务加上了行级锁。这种方式需要遍历整个表中的记录,效率很低。为此,InnoDB 引入了另外一种锁:意向锁

意向锁属于表级锁,由 InnoDB 自动添加,不需要用户干预。意向锁也分为共享和排他两种方式:

  • 意向共享锁(IS):事务在给数据行加行级共享锁之前,必须先取得该表的 IS 锁。

  • 意向排他锁(IX):事务在给数据行加行级排他锁之前,必须先取得该表的 IX 锁。

此时,事务 A 必须先申请该表的意向共享锁,成功后再申请数据行的行锁。事务 B 申请表锁时,数据库查看该表是否已经被其他事务加上了表级锁;如果发现该表上存在意向共享锁,说明表中某些数据行上存在共享锁,事务 B 申请的写锁会被阻塞。

因此,意向锁是为了使得行锁和表锁能够共存,从而实现多粒度的锁机制。以下是表级锁表级意向锁的兼容性:

  • (意向锁跟意向锁是兼容的,共享锁跟共享锁也是兼容的,其他不兼容)

 

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

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

相关文章

如何在小程序中实现页面之间的返回

在小程序中实现页面之间的返回,通常有以下几种方法,这些方法各有特点,适用于不同的场景: 1. 使用wx.navigateBack方法 描述:wx.navigateBack是微信小程序中用于关闭当前页面,返回上一页面或多级页面的API…

java技术专家面试指南80问【java学习+面试宝典】(九)

队列和栈是什么,列出它们的区别? 栈和队列两者都被用来预存储数据。java.util.Queue是一个接口,它的实现类在Java并发包中。队列允许先进先出(FIFO)检索元素,但并非总是这样。Deque接口允许从两端检索元素…

聊聊对Andorid的FileProvider的理解

最近在项目中遇到一个有关FileProvider的问题,由此来学习了一下FileProvider,有关笔记记录如下。 FileProvider是 Android 系统中一个特殊的内容提供者(ContentProvider), 它主要用于应用之间安全的共享文件。通过 FileProvider,应用可以生成一个 conte…

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。 体检系统是为体检中心、医院体检科等体检机构专门开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取,内置多级医生工作台,旨在…

每日一练:攻防世界:ewm

这道题我尝试了使用montagegaps解题,但是没有解出来,图片数量不是很多,可以尝试用PS直接拼图,但是这样学不到东西,我也就没尝试,直接看的官方WP 这段代码应该是改变工作目录到small,并且变量当…

基于springboot的宠物商城网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的宠物商城网站,java项目…

软件复盘的目的及作用

一、软件复盘的目的 软件复盘是一种在软件开发完成后、通过整理软件开发工作中的经验和教训以及对软件缺陷、进度、质量等问题的反思,识别和总结出开发团队应该坚持和改进的软件开发过程和技术的工作方式。软件复盘的主要目的是: 识别和总结软件开发过…

【Ubuntu20.04】安装XRDP远程桌面服务

【Ubuntu20.04】安装XRDP远程桌面服务 安装xrdp sudo apt install xrdp sudo adduser xrdp ssl-cert sudo systemctl restart xrdp黑屏解决 修改startwm.sh文件 sudo gedit /etc/xrdp/startwm.sh在test -x /etc/X11/Xsession上一行添加 unset DBUS_SESSION_BUS_ADDRESS un…

Linux C编译器从零开发二

自定义分词器 test.c #include <ctype.h> #include <stdarg.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h>typedef enum {TK_PUNCT, // PunctuatorsTK_NUM, // Numeric literalsTK_EOF, // …

基于carsim的线控转向仿真(1)--carsim车辆模型目标角度跟踪

一、Rwa转向执行总成建模 Rwa包括齿轮齿条机构、转向组件以及转向执行电机&#xff1b;如下图&#xff0c;电机输出轴通过齿轮减速增扭后&#xff0c;再经过一个半径为rp的小齿轮&#xff0c;直接带动齿条左右移动。齿条的移动通过转向摇臂&#xff0c;带动车轮转动&#xff0c…

使用 Apache SkyWalking 进行 Spring Cloud 应用的分布式追踪与监控:完整教程

使用 Apache SkyWalking 进行 Spring Cloud 应用的分布式追踪与监控&#xff1a;完整教程 SkyWalking 是一款开源的分布式追踪、性能监控和诊断平台&#xff0c;适用于微服务、云原生和容器化应用。它能够在分布式系统中收集和分析各个服务之间的调用关系和性能数据&#xff0…

PySide(PyQt)实现鼠标画框局部放大

按住鼠标左键画框&#xff0c;裁切画面并局部放大&#xff0c;可以用来生成ROI 1、在QtDesigner中创建ui文件&#xff0c;命名为crop.ui&#xff1a; 2、自定义脚本ImageLabel.py &#xff1a; from PySide6.QtCore import Qt, QRect, Signal, QPoint from PySide6.QtGui impo…

Redis高并发高可用

1. 复制机制 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会将数据复制多个副本部署到其他机器&#xff0c;以满足故障恢复和负载均衡等需求。Redis提供了复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;后面的…

Unity 6预览版即将增加对visionOS 2的支持

Unity表示&#xff0c;届时将能帮助你创建更为身临其境的体验&#xff0c;并通过以下主要功能实现更大的视觉多样性&#xff1a; 支持混合形状&#xff0c;以实现更广泛的几何应用&#xff0c;包括变形和平滑&#xff0c;自然的动画。 立体渲染目标&#xff0c;帮助用户实现广…

长亭网络通信基础

长亭笔试之前就已经学过一遍了 这算温故而知新吧 TCP/IP 首先我在这里默写一下之前的7层和4层 应用层 应 【表示层 数据格式转换 传 【会话层 …

Vue 3 的常用响应式 API 总结

在vue3.x版本中&#xff0c;setup函数就是vue3 组合式API的入口&#xff0c;换句话说就是在setup中的写的代码&#xff0c;就是组合式API 的写法。下面总结常用的与响应式相关的api, 帮助您在 Vue 3 中创建响应式应用程序。 reactive() 和 ref()&#xff1a; 创建响应式对象和…

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 &#x1f349;技术核心 &#x1f349;引言 &#x1f348;标识 &#x1f348;背景 &#x1f348;项目概述 &#x1f348; 文档概述 &#x1f349;可行性分析的前提 &#x1f348;项目的要求 &#x1f348;项目的目标 &#x1f348;…

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDial…

神经网络-文本-图像-音频-视频基础知识

文本、图像、音频和视频是数字媒体中的四种基本类型&#xff0c;它们各有不同的组成、单位和基础知识。下面我将逐一解释&#xff1a; 文本 组成&#xff1a;文本由字符组成&#xff0c;可以表示字母、数字、标点符号、特殊字符等。单位&#xff1a;文本的单位通常是字符&#…

宿舍用电管理模块一进三出的升级改造

宿舍用电管理模块一进三出石家庄光大远通电气有限公司产品在高校日常管理工作中,宿舍管理是一项重要工作。宿舍管理内容复杂,而且涉及学生的日常生活,意义重大。其中,学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品…