当前位置: 首页 > news >正文

MySQL 锁合集与事务隔离级别

概览

在数据库管理中,锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎,提供了多种类型的锁来保障事务的隔离性并减少冲突,从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型:

  1. 共享锁(S 锁)
    共享锁允许一个或多个事务读取同一数据行,并阻止其他事务在此数据行上获取排他锁。这种锁是协作型的,使得多个读操作可以不受干扰地同时发生。

  2. 排他锁(X 锁)
    排他锁是比共享锁更严格的锁,当事务持有排他锁时,它可以对数据行进行更新操作。其他事务不能读取或写入这个已被排他锁保护的数据行,直到锁被释放。

  3. 意向共享锁(IS 锁)
    意向锁是InnoDB用来表明事务意图在表的某些行上设置共享锁的方式。当事务打算在表中的多行上设置共享锁时,它首先会在表级别上设置意向共享锁。

  4. 意向排他锁(IX 锁)
    类似意向共享锁,意向排他锁表明事务打算在表的一行或多行上设置排他锁。它是一个表级锁,允许事务显示其对数据行的未来排它锁定的意图。

  5. 记录锁
    记录锁是最精细级别的锁,它直接作用于表中的单个记录。这种锁类型用于控制对具体一行数据的读写操作,通常与其他锁类型结合使用,以实现更高的并发性。

  6. 间隙锁
    间隙锁用于锁定一组记录的间隙,也就是两个索引记录之间的范围。这种锁防止其他事务在间隙范围内插入新行,是InnoDB间隙锁定策略的一部分。

  7. Next-Key锁
    Next-Key锁结合了记录锁和间隙锁的特性,锁定一个索引记录以及该记录前的间隙。这种锁是InnoDB中默认的锁类型,旨在防止幻读现象。

  8. 插入意向锁
    当事务准备插入新行时,它会先设置插入意向锁。这个锁与其它事务的插入意向锁是兼容的,但与在相同位置的其他类型锁冲突,用于在插入时维持间隙锁的正确性。

  9. AUTO-INC锁
    AUTO-INC锁是一种特殊类型的锁,在事务插入新值到带有AUTO_INCREMENT属性的列时使用。这个锁确保新生成的自动增长值的唯一性和连续性。

锁列表

  1. 共享锁(S 锁): 允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁
  2. 排他锁(X 锁): 允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁
  3. 意向共享锁(IS 锁): 表明一个事务打算在表中的行上设置 S 锁
  4. 意向排他锁(IX 锁): 表明一个事务打算在表中的行上设置 X 锁
  5. 记录锁: 用于锁定表中的行
  6. 间隙锁: 用于锁定表中的一个“间隙”,用以防止并发的插入操作
  7. Next-Key锁: 锁定一个索引记录与该记录之前的“间隙”,即锁定的是该键值的前闭后开区间
  8. 插入意向锁: 当InnoDB插入一行时,它会先在被插入的位置设置一个插入意向锁,这意味着这个事务打算插入一行
  9. AUTO-INC锁: 在插入AUTO_INCREMENT列的新值时使用

事务隔离级别和锁关系

事务隔离级别使用的锁类型不使用的锁类型脏读幻读不可重复读原因
读未提交 (Read Uncommitted)排他锁(X锁)共享锁(S锁), 间隙锁, Next-Key锁, 意向共享锁(IS锁), 意向排他锁(IX锁)高并发,最低级别的数据隔离,直接读取数据库中无论是否提交的数据。
读提交 (Read Committed)排他锁(X锁), 记录锁间隙锁, Next-Key锁防止脏读,只能读取提交后的数据,但事务内部的多次读取可能见到不同数据。
可重复读 (Repeatable Read)共享锁(S锁), 排他锁(X锁), Next-Key锁, 插入意向锁间隙锁(可选)默认级别,保证事务内可见数据的一致性,防止幻读和不可重复读。
可序列化 (Serializable)共享锁(S锁), 排他锁(X锁), 意向共享锁(IS锁), 意向排他锁(IX锁), 表级锁间隙锁(可能)最高级别的数据隔离,加锁防止所有事务并发,确保数据一致性。

解释:

  • 脏读:读取到其他未提交事务中的数据。
  • 幻读:在一个事务内读取时,因为其他并发事务的插入操作,一次查询和下一次查询的结果集不一致。
  • 不可重复读:在同一个事务内,多次读取同一数据集合时,因其他事务的修改操作导致后续读取的结果与起始读取不同。

总结

想象你一下,你使用Spring声明式事务@Transactional,然后在代码中各种使用Feign/RestTemplate/WebClient进行内部和外部调用,你想想你的数据库是什么感受。它就各种锁锁锁,然后业务就各种DeadLock,DeadLock。

相关文章:

MySQL 锁合集与事务隔离级别

概览 在数据库管理中,锁是用来控制多个事务对同一数据的并发访问的机制。InnoDB作为MySQL的默认事务型存储引擎,提供了多种类型的锁来保障事务的隔离性并减少冲突,从而维护数据库的完整性和一致性。以下是InnoDB提供的主要锁类型&#xff1a…...

题解 -- 第六届蓝桥杯大赛软件赛决赛C/C++ 大学 C 组

https://www.lanqiao.cn/paper/ 1 . 分机号 模拟就行 : inline void solve(){int n 0 ;for(int a1;a<9;a){for(int b0;b<9;b){for(int c0;c<9;c){if(a>b && b>c){n ;}}}}cout << n << endl ; } 2 . 五星填数 直接调用全排列的库函数…...

Lua脚本的使用

一、使用lua脚本扣减单个商品的库存 SpringBootTest class LuaTests {AutowiredStringRedisTemplate stringRedisTemplate;Testvoid test3() {for (int i 1; i < 5; i) {stringRedisTemplate.opsForValue().set("product."i,String.valueOf(i));}}Testvoid test…...

hcia datacom课程学习(5):MAC地址与arp协议

1.MAC地址 1.1 含义与作用 &#xff08;1&#xff09;含义&#xff1a; mac地址也称物理地址&#xff0c;是网卡设备在数据链路层的地址&#xff0c;全世界每一块网卡的mac地址都是唯一的&#xff0c;出厂时烧录在网卡上不可更改 &#xff08;2&#xff09;作用&#xff1a…...

unbuntu mysql8.0新建用户及开启远程连接

MySQL更新到8.0以上版本后&#xff0c;在创建连接远程的用户的时候和之前5.x的版本有了很大的不同&#xff0c;不能使用原来同时创建用户和授权的命令。 以下是记录的MySQL8.0创建用户并授权的命令&#xff1a; 查看用户表&#xff1a; user mysql; select host,user,authen…...

Intel FPGA (1):线性序列机

Intel FPGA (1)&#xff1a;线性序列机 前提摘要 个人说明&#xff1a; 限于时间紧迫以及作者水平有限&#xff0c;本文错误、疏漏之处恐不在少数&#xff0c;恳请读者批评指正。意见请留言或者发送邮件至&#xff1a;“Email:noahpanzzzgmail.com”。本博客的工程文件均存放在…...

翻译: 硅谷软件工程师面试:准备所需的一切

没有人有时间去做成百上千道LeetCode题目&#xff0c;好消息是你实际上并不需要做那么多题目就能够在FAANG公司找到工作&#xff01; 我曾经在Grab工作&#xff0c;这是东南亚的一家共享出行公司&#xff0c;但我对工作感到沮丧&#xff0c;想要进入FAANG公司&#xff0c;但我…...

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…...

kubuntu23.10安装sdl2及附加库和 sfml2.5.1

2024年3月28号&#xff0c;四&#xff0c;晚上kubuntu23.10下安装了sdl2的如下&#xff0c;没有安装gfx。 sudo apt install libsdl2-dev sudo apt install libsdl2-image-dev sudo apt install libsdl2-ttf-dev sudo apt install libsdl2-mixer-dev sudo apt install libsdl2…...

Centos JDK1.8 下载安装

https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html 一 RPM包安装 rpm -ivh jdk-8u391-linux-x64.rpm /etc/profile export JAVA_HOME/usr/java/jdk1.8.0-x64 export PATH$JAVA_HOME/bin:$PATHsource /etc/profile二 tar.gz 包手动…...

iOS开发进阶(十四):xcodebuild 命令应用详解

文章目录 一、前言二、xcodebuild 命令汇总三、xcodebuild 可选命令四、exportOptionsPlist文件内容配置说明五、项目实操六、拓展阅读 一、前言 关于iOS组包&#xff0c;详参博文《ReactNative进阶&#xff08;三十四&#xff09;&#xff1a;Jenkins 流水线 组包 iOS 应用包…...

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…...

构建第一个JS应用(FA模型)

创建JS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择Application应用开发&#xff08;本文以应用开发为例&#xff0c;Atomic Service对…...

物联网学习2、MQTT 发布/订阅模式介绍

MQTT 发布/订阅模式 发布订阅模式&#xff08;Publish-Subscribe Pattern&#xff09;是一种消息传递模式&#xff0c;它将发送消息的客户端&#xff08;发布者&#xff09;与接收消息的客户端&#xff08;订阅者&#xff09;解耦&#xff0c;使得两者不需要建立直接的联系也不…...

docker--部署 (超详版) (五)

环境准备&#xff1a;docker&#xff0c;mysql&#xff0c;redis&#xff0c;镜像&#xff0c;nginx 把虚拟机打开&#xff0c;连接xshell&#xff0c;参考博客&#xff1a; https://blog.csdn.net/m0_74229802/article/details/136965820?spm1001.2014.3001.5501 一&#x…...

谷粒商城——通过接口幂等性防止重复提交订单

如果用户向后端服务提交多次相同订单的提交服务&#xff0c;那么后端应该只生成一条订单记录。 有一些操作天然是幂等的&#xff0c;如查询操作和删除操作等。 幂等性实现 1.token机制&#xff08;仅这个方法适用于订单的重复提交&#xff09; 后端先生成1个令牌将其记录在R…...

谈谈MVCC机制

在MySQL中&#xff0c;MVCC&#xff08;多版本并发控制&#xff09;是InnoDB存储引擎使用的并发控制机制。它提供对数据的并发访问&#xff0c;并确保多用户环境中数据的一致性和隔离性。 InnoDB通过“Undo log”存储每条记录的多个版本&#xff0c;提供历史记录供读取&#x…...

Linux之用户账号、用户组和与账号有关的系统文件

目录 一、基本介绍 1.用户和用户组 2.UID和GID 二、 账户管理 1.查看用户的UID和GID 2.添加账户 3.删除账号 4.修改账号 5.账户口令 三、分组管理 1.新增用户组 2.删除用户组 3.修改用户组 4.用户组切换 四、与账号有关的系统文件 1./etc/passwd 2./etc/shado…...

mac 安装 pip,如果你的电脑已经有 python3

文章目录 如果没装 如果你的电脑已经有 python3. 安装 pip 执行以下命令&#xff0c; 输入 python3 -m ensurepip --upgrade &#xff0c;按下Enter就大功告成了&#xff01; 安装后查看版本&#xff1a; pip3 -V 如果没装 先安装 python&#xff0c;建议使用 homebrew。 …...

java 枚举

枚举的格式 枚举是一种特殊的类 枚举类的最开始必须罗列所有类型 枚举类提供了一些父类的方法 values() :获取所有的的枚举对象,是一个数组 public enum A {A1, A2, A3;String name;A() {this.name "default";}String getName() {return name;}void setName(Strin…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...