前言

如果一个线程回滚,例如唯一键冲突的情况回滚时,回滚了sql语句,但是并没有把自增的值也-1。那么就会导致下一条插入的数据自增id出现了跳跃。


自增主键为什么不是连续的?

  • 前言
  • 执行时机
  • 为什么自增主键不是连续的
  • 为什么不回滚自增主键
  • innodb_autoinc_lock_mode
  • 设置成2导致的问题

执行时机

mysql的自增主键+1的时机是在mysql真正执行之前,获取当前值并加1。

为什么自增主键不是连续的

如果一个线程回滚,例如唯一键冲突的情况回滚时,回滚了sql语句,但是并没有把自增的值也-1。那么就会导致下一条插入的数据自增id出现了跳跃。

为什么不回滚自增主键

之所以不让自增主键回滚是因为:

  1. 假如两个线程一个获取了id =2 ,另一个是id =3 。id=3的完成之后,如果id=2的需要回滚,那么后面再来一个插入请求,就会获取id=2的值,然后再来一个数据就会获取3从而导致主键冲突。
    如果要解决这个冲突:
    1. 就要每次插入时还要去数据库里查询一下是否有这个自增主键。这是非常耗时的,本来一个非常简单的操作,现在就会变得非常复杂。
    2. 还有一种方法就是扩大每次获取自增值的锁时间,对于自增值的锁一般是很快的获取之后+1然后就会释放。如果要防止上面的冲突,就是等这个sql执行完成之后,再允许其它线程获取这个锁。这显然也会大大降低并发值,因此mysql放弃了连续。

innodb_autoinc_lock_mode

那么后来mysql添加了一个参数innodb_autoinc_lock_mode,

  1. 如果设置成0:就是会等一个写入执行完成之后,再让另一个线程获取自增的值
  2. 如果设置成1:那么对于单个的insert值,就会获取到自增值就直接释放。但是对于批量写入或者批量替换的请求,那么就会等这个操作执行完成之后,再让另一个线程获取自增值。
  3. 如果设置成2,那么所有的insert操作都会获取到自增值之后直接释放。不等sql执行结束。

设置成2导致的问题

如果再批量插入A的时候,id是自增1,2,3,4,6,7,另一个线程B也插入了一条数据5,

但是在写入binlog的时候,是一个线程一个线程写入的。

那么线程B插入的数据对应的id只能是线程A开头的或者结尾,如果binlog的format= statement。就会导致主备数据不一致。
所以这这又是一个将binlog的format= row的原因。

这里需要注意 如果线程A不是批量写入的语句。只是一个普通的insert语句ID 1,然后又有另一个线程B获取自增建ID 2。但是再写入binlog时,线程B先写入了,然后线程A写入。
这种情况下 即使binlog的format=statement 也不会导致主备数据的数据不一致。在binlog中还有一个步长的参数,在执行线程B时,步长会为2,ID还是2,执行线程A时,步长是1,ID还是1。

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

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

相关文章

OpenCV图像基本操作:读取、显示与保存

在图像处理项目中,图像的 读取(imread)、显示(imshow) 和 保存(imwrite) 是最基础也是最常用的三个操作。本文将详细介绍这三个函数的功能、用法和注意事项,并提供一个完整示例供读者…

.NET控制台应用程序中防止程序立即退出

在VB.NET控制台应用程序中防止程序立即退出,主要有以下几种常用方法,根据需求选择适合的方案: 方法1:等待用户输入(推荐) Module Module1Sub Main()Console.WriteLine("程序开始运行...") 这里是…

Vue3 + Three.js 极速入门:打造你的第一个3D可视化项目

文章目录前言一、环境准备1.1 创建Vue3项目1.2 安装Three.js二、Three.js核心概念速览三、实战:创建旋转立方体3.1 组件化初始化四、核心代码解析4.1 Vue3响应式整合技巧4.2 性能优化要点五、进阶功能扩展5.1 数据驱动控制5.2 加载3D模型六、常见问题解决七、资源推…

【设计模式】享元模式(轻量级模式) 单纯享元模式和复合享元模式

享元模式(Flyweight Pattern)详解一、享元模式简介 享元模式(Flyweight Pattern) 是一种 结构型设计模式(对象结构型模式),它通过共享技术实现相同或相似对象的重用,以减少内存占用和…

驱动开发_2.字符设备驱动

目录1. 什么是字符设备2. 设备号2.1 设备号概念2.2 通过设备号dev分别获取主、次设备号的宏函数2.3 主设备号的申请静态申请动态分配2.4 注销设备号3. 字符设备3.1 注册字符设备3.2 注销字符设备3.3 应用程序和驱动程序的关系3.4 file_opertaions结构体3.5 class_create3.6 创建…

直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡

直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡由于我们的甲方客户要开始为我们项目产品上加入私有化的直播,这块不得不又捡起来曾经我们做直播推流的事情了,其实私有化直播一直并不是一件容易的事情,现在大部分…

一文读懂现代卷积神经网络—深度卷积神经网络(AlexNet)

目录 深度卷积神经网络(AlexNet)是什么? 一、AlexNet 的核心创新 1. 深度架构 2. ReLU 激活函数 3. 数据增强 4. Dropout 正则化 5. GPU 并行计算 6. 局部响应归一化(LRN) 二、AlexNet 的网络结构 三、AlexN…

JVM 垃圾收集算法全面解析

1. 引言1.1 为什么需要垃圾收集?在Java应用中,垃圾收集(Garbage Collection,GC)是一个至关重要的机制,它使得开发者不需要手动管理内存。与传统的语言(如C或C)不同,Java通…

Vmware中安装的CentOS7如何扩展硬盘大小

起初创建虚拟机时,大小设置不合理,导致我在尝试开源项目时空间不足重新扩展硬盘,不仅需要在虚拟机设置中配置,还需要在系统内重新进行分区一、虚拟机设置打开虚拟机设置→硬盘→扩展,将大小设置为自己期望的大小&#…

Python+MongoDB高效开发组合

如大家所知,Python与MongoDB的结合是一种高效的开发组合,主要用于通过Python进行数据存储、查询及管理,利用MongoDB的文档型数据库特性实现灵活的数据处理。下面让 Python 连接上 MongoDB:安装 PyMongo:pip3 install p…

【论文阅读】Masked Autoencoders Are Effective Tokenizers for Diffusion Models

introduce什么样的 latent 空间更适合用于扩散模型?作者发现:相比传统的 VAE,结构良好、判别性强的 latent 空间才是 diffusion 成功的关键。研究动机:什么才是“好的 latent 表征”?背景:Diffusion Models…

每日一SQL 【游戏玩法分析 IV】

文章目录问题案例执行顺序使用分组解决问题 案例 执行顺序 SQL 语句的执行顺序(核心步骤) 同一层级的select查询内部, 别名在整个 SELECT 计算完成前不生效 使用分组解决 select distinct s.product_id, Product.product_name from Sales sleft join …

内部文件审计:企业文件服务器审计对网络安全提升有哪些帮助?

企业文件服务器审计工作不仅对提升企业网络信息安全起到重要作用,还能对企业内部网络文件信息是否合规进行判断。因此企业文件服务器审计一直被高度重视。 一、文件服务器为何成为攻击焦点? 企业文件服务器通常集中存储财务报表、人事档案、研发资料、客…

FusionOne HCI 23 超融合实施手册(超聚变超融合)

产品介绍 FusionOne HCI作为实现企业信息一体化的IT基础设施平台,以“软硬件垂直深度集成和调优”、“快速部署”、“统一管理”的理念,提供应用融合部署,提升核心业务运作效率,降低整体采购成本。 FusionOne HCI代表了IT产品的…

AI算姻缘测算小工具流量主微信小程序开源

功能特点 响应式设计:完美适配各种移动设备屏幕尺寸 精美UI界面: 柔和的粉红色渐变背景 圆角卡片设计 精心设计的字体和间距 爱心图标点缀 动态效果: 点击按钮时的动画反馈 测算结果的平滑过渡动画 爱心漂浮动画 进度条动态填充 AI测算功能&a…

Vue获取上传Excel文件内容并展示在表格中

一、安装依赖 npm install xlsx 二、引用依赖 import XLSX from xlsx 三、代码实现 1、注意&#xff1a;函数 analysis 中reader.readAsBinaryString(file)&#xff0c;file的数据格式如图所示 2、示例代码 <!-- 项目使用的前端框架为非流行框架&#xff0c;主要关注…

pipelineJob和pipeline的关系

pipelineJob与pipeline在Jenkins体系中构成配置层与执行层的协同关系,具体关联如下: 一、核心功能定位 概念作用实现层级pipelineJob定义Job的元数据(如SCM配置、日志策略)配置层pipeline描述实际构建流程(如阶段划分、并行任务)执行层scriptPath桥梁作用:将配置层定义…

第二十篇 Word文档自动化:Python批量生成、模板填充与内容修改,告别繁琐排版!

python实现word 自动化重复性文档制作&#xff0c;手动填充模板&#xff0c;效率低下还易错1.python-docx入门&#xff1a;Word文档的“瑞士军刀”&#xff01;1.1 安装与基础概念&#xff1a;文档、段落、运行、表格1.2 打开/创建Word文档&#xff1a;Python与Word的初次接触1…

【C# in .NET】7. 探秘结构体:值类型的典型代表

探秘结构体&#xff1a;值类型的典型代表 在 C# 的类型系统中&#xff0c;结构体&#xff08;Struct&#xff09;作为值类型的典型代表&#xff0c;一直扮演着既基础又微妙的角色。许多开发者在日常编码中虽频繁使用结构体&#xff08;如int、DateTime等&#xff09;&#xff0…

深入探讨Hadoop YARN Federation:架构设计与实践应用

Hadoop YARN Federation简介基本概念与设计初衷Hadoop YARN Federation作为Apache Hadoop 3.x版本的核心特性之一&#xff0c;其本质是通过多集群联合管理机制突破单点资源管理器的性能瓶颈。传统YARN架构中&#xff0c;单个ResourceManager&#xff08;RM&#xff09;需要管理…