自增主鍵為什么不是連續的?

前言

如果一個線程回滾,例如唯一鍵沖突的情況回滾時,回滾了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;需要管理…