66 mysql 的 表自增长锁

前言

mysql 的表锁之 AUTO_INC, 是我们自增长的时候做并发控制的锁 

主要是用于 自增长生成新的 id 的时候的控制 

在前面的文档中, 我们又看到 mysql 这边自增长的处理的相关的大概脉络

但是 对于一些 并发控制的细节, 我们当时 应该是直接忽略掉了  

我们这里就来看一下 mysql 这里的 AUTO_INC 的一个实现 

当然 它的实现 有几种方式, 模式选择有 0, 1, 2

模式为 0 的场景下, 主要是 基于乐观锁, 每一个表映射一个 mutex, 来尝试乐观获取锁 

模式为 1 的场景下, 对于 INSERT, REPLACE 命令主要是 基于乐观锁, 每一个表映射一个 mutex, 来尝试乐观获取锁, 其他的场景基于 表自增长锁

模式为 2 的场景下, 主要是基于和前面的 表共享锁, 表排他锁 一个级别的 表自增长锁

我们这里核心关注的是 表自增长锁 的相关实现

 

 

表自增长锁

获取 LOCK_AUTO_INC 这边的实现 和 获取其他表级别的锁的主流程一致

差异在于 LOCK_AUTO_INC 和其他锁的兼容性, 在之前 表共享锁, 表排他锁 的场景下面, 为了简化问题, 我们是跳过了 LOCK_AUTO_INC, 这里我们来讲 LOCK_AUTO_INC 代入进来看看 

e792b2929fb6978302d6e87fc3d60a29.png

 

从这里可以看到, 如果是我们 LOCK_AUTO_INC 这边和 表意向锁 是兼容的

和 LOCK_AUTO_INC 是不兼容的, 和 表共享锁, 表排他锁 是不兼容的

总结下来意思就是, 如果是 事务1 获取的是 行锁, 那么是不影响 事务2 获取 表自增长锁 的

如果是 事务1 获取的是 表自增长锁, 那么是会阻塞 事务2 获取 表自增长锁 的

如果是 事务1 获取的是 表共享锁, 表排他锁, 那么是会阻塞 事务2 获取 表自增长锁 的

b806a5361a2750bb7b50bb42a5bda834.png

 

整体的这边获取 表自增长锁 这边的具体的 锁表策略 分派方式如下

基本上三种策略就是 mutex乐观锁 + mutex乐观锁, 表自增长锁 + 表自增长锁 

e04368ca75dc970792fde762d1bacd4f.png

 

 

表自增长锁的获取和释放

表自增长锁 的获取是在执行 insert sql 的时候

d0bf6e144eb8d6333668599078ccfe16.png

 

然后释放 表自增长锁 是在语句执行完成之后释放的 如下 

304289f9f22d792835fc5167d90674c4.png

 

 

表自增长锁阻塞的 N 中方式

表自增长锁 的阻塞方式 就是上面提及的 表共享锁, 表排他锁, 表自增长锁 被持有的情况下  

假设我们这里尝试模拟 各种阻塞的方式, 事务1先进行执行, 然后事务2尝试获取表排他锁, 产生阻塞 

事务2 这边执行固定的 sql 语句如下 

begin;
INSERT INTO `test_02`.`tz_test_02`(`field1`, `field2`) VALUES ('field1', '11');
commit;

 

事务1获取 表排他锁 导致 事务2获取MDL元数据锁 阻塞

begin;
lock tables tz_test_02 write;
-- sleep 10min
unlock tables;
commit;

 

事务1获取 表共享锁 导致 事务2获取MDL元数据锁 阻塞

begin;
lock tables tz_test_02 read;
-- sleep 10min
unlock tables;
commit;

 

 

事务1 获取了 表自增长锁, 导致事务2获取MDL元数据锁 阻塞        

 

 

 

 

 

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

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

相关文章

GameFi的前景:游戏与金融的未来交汇点

随着区块链技术的迅速发展,GameFi(游戏金融)作为一种新兴的商业模式,正在重新定义游戏行业的未来。GameFi将游戏与去中心化金融(DeFi)结合,创造出一种全新的经济生态,吸引了大量玩家…

Vue 3 中 onUnload 和 onPageScroll 使用详解

Vue 3 中 onUnload 和 onPageScroll 使用详解 在 Vue 3 中,当我们开发微信小程序时,通常需要处理页面生命周期事件和页面滚动事件,比如页面卸载 (onUnload) 和页面滚动 (onPageScroll) 等。这些功能对优化用户体验、实现动态效果以及处理页面…

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容)

Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 目录 Unity 使用 Excel 进行配置管理(读Excel配置表、Excel转保存Txt 文本、读取保存的 Txt 文本配置内容) 一、简单介绍 二、实现原理 三、注意事项 四、案例简单步…

Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

续 上集说到语义搜索,这集接着玩一下图搜图,这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索,代码逻辑结构都很类似… 开搞 还是老地方modelscope找个Vision Transformer模型,这里选用vit-base-patch16-224…

HCIA笔记3--TCP-UDP-交换机工作原理

1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间? (a) 为了实现可靠的关闭 (b)为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…

docker搭建私有仓库,实现镜像的推送和拉取

1.拉取docker仓库镜像 docker pull registry 2.启动registry容器 docker run -d registry 3.查看当前仓库中存在的镜像(一) curl -XGET http://192.168.111.162: 5000/v2/_catalog 192.168.111.162 部署docker仓库宿主机的ip 5000 部署docker仓库映射到宿…

提取图片高频信息

提取图片高频信息 示例-输入: 示例-输出: 代码实现: import cv2 import numpy as npdef edge_calc(image):src cv2.GaussianBlur(image, (3, 3), 0)ddepth cv2.CV_16Sgray cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)grad_x cv2.Scharr(g…

kali安装过程中会遇到的问题和解决方法

在安装Kali Linux过程中,我们可能会遇到一些常见问题,这些问题及其解决方法如下: 1. 安装过程中卡住或停滞 问题描述: 安装过程卡在某一步,常见的如“Detecting hardware”或“Installing packages”阶段。 解决方法: 检查安装…

greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用

简略图 greater<>()(a, b) a > b 返回true&#xff0c;反之返回false less<>()(a, b) a < b 返回true&#xff0c;反之返回false 在cmp中使用&#xff08;正着理解&#xff09; 规则返回true时a在前&#xff0c;反之b在前 在priority_queue中使用 &#xff…

助力企业解决降本增效的难题,Altair HPCWorks新功能创新升级

“IO一旦出现问题&#xff0c;整个计算效率会降低50%以上。License、昂贵的硬件、紧张的项目周期都会因此而卡顿&#xff0c;而HPCWorks可以帮助包括像英伟达这样的顶尖客户随时了解研发资源的实时情况和实时瓶颈。 —— Altair 企业计算部技术总监 王轶华 在2024年 Altair 技…

Java根据前端返回的字段名进行查询数据的方法

在Java后端开发中&#xff0c;根据前端返回的字段名动态查询数据库是一种常见的需求。这种需求通常通过使用反射和动态SQL来实现。下面是一个完整的代码示例&#xff0c;它展示了如何根据前端返回的字段名动态查询数据库中的数据。 一、根据前端返回的字段名动态查询数据库中的…

蓝桥杯每日真题 - 第20天

题目&#xff1a;&#xff08;机房&#xff09; 题目描述&#xff08;13届 C&CG题&#xff09; 解题思路&#xff1a; 这道题目可以看作在一个无向图中查找两点之间的最短路径。题目中的 n 台电脑和 n−1 根网线形成了一棵树&#xff0c;树是一个特殊的无向图&#xff0c…

【Python系列】浅析 Python 中的字典更新与应用场景

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

node.js、nginx、iis、tomcat针对部署方面的简述

了解 Node.js、Nginx、IIS 和 Tomcat 这些技术的部署方式及其应用场景&#xff0c;可以帮助你做出更合理的架构选择。下面是这些技术的简要讲解及它们在部署中的应用&#xff1a; 1. Node.js 部署 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境&#xff0c;广泛…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

【课堂笔记】隐私计算实训营第四期:“隐语”可信隐私计算开源框架

“隐语”可信隐私计算开源框架 隐语架构一览隐语架构拆解产品层算法层PSI/PIR数据分析&#xff08;Data Analysis&#xff09;联邦学习&#xff08;Federated Learning&#xff09; 计算层混合编译调度——RayFedSPUHEUTEEUYACL 资源层KUSCIA 互联互通跨域管控 隐语架构一览 隐…

Kubernetes的pod控制器

文章目录 一&#xff0c;什么是pod控制器二&#xff0c;pod控制器类型&#xff08;重点&#xff09;1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Job6.Cronjob 三&#xff0c;pod与控制器的关系1.Deployment2.SatefulSet2.1StatefulSet组成2.2headless的由来2.3有状态服…

一文读懂埋阻埋容工艺

PCB 埋阻埋容工艺是一种在 PCB 板内部埋入电阻和电容的工艺。通常情况下&#xff0c; PCB 上电阻和电容都是通过贴片技术直接焊接在板面上的&#xff0c;而埋阻埋容工艺则将电 阻和电容嵌入到 PCB 板的内部层中&#xff0c;这种印制电路板,其自下而上依次包括第一介电 层,隐埋电…

QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)

使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R) 纸张、薄膜、塑料、金属箔、新能源电池和卷料生产设备 (converting equipment) 的制造商正在转向建模和仿真&#xff0c;以提升卷料处理的设备性能和产品质量。MapleSim 卷料处理库提供了专业的建模元件以及功能&a…

MATLAB读入不同类型图像并显示图像和相关信息

MATLAB&#xff08;Matrix Laboratory)是一种常用的数学工具软件&#xff0c;MATLAB以矩阵运算为核心&#xff0c;为图像处理提供了高效的数据处理能力。图像处理中的许多操作都可以转化为矩阵运算&#xff0c;从而利用MATLAB的矩阵运算能力进行优化和加速。在图像处理方面&…