InnoDB如何解決幻讀的

InnoDB 使用一種稱為 Next-Key Locking 的鎖機制來解決幻讀問題。幻讀發生在一個事務在讀取某個范圍內的記錄時,另一個事務在這個范圍內插入新的記錄。InnoDB 的 Next-Key Locking 結合了行鎖(Row Lock)和間隙鎖(Gap Lock),確保在執行范圍查詢時能夠鎖定現有記錄以及它們之間的間隙,從而防止其他事務在該范圍內插入新的記錄。

Next-Key Locking 機制

Next-Key Locking 是一種在索引記錄上應用的鎖機制,它鎖住的并不僅僅是索引記錄本身,還包括索引記錄之間的間隙。這種機制可以防止其他事務在鎖定的范圍內插入新的記錄。

具體例子

假設你有一個包含以下記錄的表 employees

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Bob'), (5, 'Charlie');

在使用可重復讀(REPEATABLE READ)隔離級別時,InnoDB 如何避免幻讀?考慮以下兩個事務:

  • 事務 A:執行一個范圍查詢。
  • 事務 B:在事務 A 的范圍內插入新的記錄。
事務 A
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 5;

當事務 A 執行上述查詢時,InnoDB 會對滿足條件的所有記錄(id=1, id=3, id=5)以及這些記錄之間的間隙((1,3), (3,5), (5,∞))加鎖。

事務 B
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (2, 'David');

由于事務 A 已經鎖定了 id 范圍 [1,5] 及其間隙,所以事務 B 嘗試在范圍 [1,3] 的間隙中插入 id=2 的新記錄時會被阻塞,直到事務 A 提交或回滾。

示例演示

創建表和插入數據
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100)
);INSERT INTO employees (id, name) VALUES (1, 'Alice'), (3, 'Bob'), (5, 'Charlie');
事務 A
START TRANSACTION;
SELECT * FROM employees WHERE id BETWEEN 1 AND 5; -- Next-Key Locking 在索引記錄及其間隙上加鎖
事務 B
START TRANSACTION;
INSERT INTO employees (id, name) VALUES (2, 'David'); -- 此操作會被阻塞,直到事務 A 提交或回滾
提交事務 A
COMMIT; -- 提交事務 A 后,事務 B 可以繼續執行

總結

InnoDB 使用 Next-Key Locking 機制通過結合行鎖和間隙鎖來解決幻讀問題。當一個事務在執行范圍查詢時,InnoDB 會鎖定查詢結果集中的每一條記錄以及這些記錄之間的間隙。這確保了在范圍內的任何插入操作都被阻塞,從而避免了幻讀。

這種鎖機制在可重復讀(REPEATABLE READ)隔離級別下有效地避免了幻讀,使得事務在讀取范圍內的數據時,不會因為其他事務的插入而讀取到新的“幻影”記錄。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/13775.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/13775.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/13775.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MavLinK協議

由于在公司需要使用這個,我就寫一個文章用于入門級別 簡單介紹 MAVSDK是PX4開源團隊貢獻的基于mavlink通信協議的用于無人機應用開發的SDK,其可以部署在Windows、Linux、Android等多種平臺,并且支持多種語言如c/c、python、Java等。 在官網…

GIS讀研與求職準備:GNSS專業研0

本文介紹GIS方向研究生入學初期,為將來轉碼、從事開發類工作所作求職準備的規劃路徑、方向選擇等方面的建議。 最近,有很多師弟師妹詢問關于研究生方向選擇、求職準備、就業方向選擇等方面的問題。首先非常感謝大家的盲目信任(開個玩笑&#…

基于 debian 12 利用 kubeadm 部署 k8s 1.29 版本

基于 debian 12 利用 kubeadm 部署 k8s 1.29 版本 預先準備 準備三臺debian 12的虛擬機,配置如下: HostnameIP配置k8s-master1192.168.31.604vCPU、8GiB 內存、50GiB 硬盤k8s-worker1192.168.31.614vCPU、8GiB 內存、50GiB 硬盤k8s-worker2192.168.31.6…

python從0開始學習(九)

前言 上一篇文章我們介紹了python中的序列類型和元組類型,本篇文章將接著往下將。 1、字典類型 字典類型是根據一個信息查找另一個信息的方式所構成的“鍵值對”,它表示索引用的鍵和對應的值構成的成對關系。它是一個可變數據類型,也就是說它…

Leetcode 3154. Find Number of Ways to Reach the K-th Stair

Leetcode 3154. Find Number of Ways to Reach the K-th Stair 1. 解題思路2. 代碼實現 題目鏈接:3154. Find Number of Ways to Reach the K-th Stair 1. 解題思路 這一題思路上就是一個動態規劃,我們只需要確定一下運行的終止條件,然后寫…

React中顯示數據

SX 會讓你把標簽放到 JavaScript 中。而大括號會讓你 “回到” JavaScript 中&#xff0c;這樣你就可以從你的代碼中嵌入一些變量并展示給用戶。例如&#xff0c;這將顯示 user.name&#xff1a; return (<h1>{user.name}</h1> ); 你還可以將 JSX 屬性 “轉義到 …

《web應用技術》第9次課后作業

一、將前面的代碼繼續完善功能 1、采用XML映射文件的形式來映射sql語句&#xff1b; 2、采用動態sql語句的方式&#xff0c;實現條件查詢的分頁。 二、學習git的使用。 1、每個小組將自己的項目上傳到gitee&#xff0c;學會協作開發&#xff1b; 2、學會從gitee上拉取項目…

【Text2SQL 經典模型】TypeSQL

論文&#xff1a;TypeSQL: Knowledge-Based Type-Aware Neural Text-to-SQL Generation ??? Code: TypeSQL | GitHub 一、論文速讀 本論文是在 SQLNet 網絡上做的改進&#xff0c;其思路也是先預先構建一個 SQL sketch&#xff0c;然后再填充 slots 從而生成 SQL。 論文發…

C++函數指針,鍵值對集合的學習

這段代碼使用了 std::unordered_map 來存儲 std::wstring 作為鍵&#xff08;key&#xff09;&#xff0c;而對應的值&#xff08;value&#xff09;是一個 std::function<void(std::array<int, 5>, SomeClass&, int)> 類型的函數指針。這個結構使得根據字符串…

C++ 時間處理-日期時間類

1. 關鍵詞2. 問題3. 設計理念4. 支持的能力5. 代碼實現 5.1. datetime.h5.2. timecount.cpp 6. 測試代碼7. 運行結果8. 源碼地址 1. 關鍵詞 C 時間處理 日期時間類 跨平臺 2. 問題 為什么C就沒有一個方便好用的表示日期時間的類&#xff1f; 同樣是高級語言&#xff0c;Ja…

2024 HGDD 榮耀開發者日·成都站

HGDD 榮耀開發者日成都站 活動時間&#xff1a;2024 年 5 月 27 日 活動地點&#xff1a;成都市雙流區 LA CADIERE 蔚藍湖濱城 期待與大家的見面&#xff01;

ISO 9001認證 要換版了!

ISO TC176/SC2 第50次會議2023年10月8日至13日在盧旺達基加利舉行。 會議確定ISO 9001標準的修訂從2024年1月開始&#xff0c;將包括WD&#xff08;Working Draft&#xff09;、CD&#xff08; Committee Draft&#xff09;、DIS&#xff08;Draft for International Standard&…

js+vue3+elementplus發送驗證碼實現(含倒計時重新發送)

<template><el-form :model"formValue" :rules"rules" ref"form"><el-form-item prop"phone"><el-input v-model.number"formValue.phone" class"form-input" placeholder"請輸入手機號…

[matlab]yalmip國內源yalmip下載地址所有版本匯總

概述 MATLAB是一個強大的數值計算工具&#xff0c;用于數學建模、算法開發和數據分析。在MATLAB中&#xff0c;有很多工具箱可以幫助用戶完成不同類型的任務。本文將介紹如何在MATLAB中安裝Yalmip和Cplex&#xff0c;這兩個工具箱可以幫助用戶解決優化問題。 如果不想看文字描…

【oracle004】oracle內置函數手冊總結(已更新)

1.熟悉、梳理、總結下oracle相關知識體系。 2.日常研發過程中使用較少&#xff0c;隨著時間的推移&#xff0c;很快就忘得一干二凈&#xff0c;所以梳理總結下&#xff0c;以備日常使用參考 3.歡迎批評指正&#xff0c;跪謝一鍵三連&#xff01; 總結源文件資源下載地址&#x…

RoctetMQ使用(2):在項目中使用

一、導入相關依賴 在項目中引入MQ客戶端依賴&#xff0c;依賴版本最好和RocketMQ版本一致。 <!-- rocket客戶端--><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version&…

npm常用指令

基礎 命令&#xff1a;run 解釋&#xff1a;運行腳本 示例&#xff1a;npm run dev 命令&#xff1a;list || ls 解釋&#xff1a;查看依賴列表 示例&#xff1a;npm list || npm ls 命令&#xff1a;install || i 解釋&#xff1a;安裝依賴 示例&#xff1a;npm install ||…

一文掌握python隨機數random模塊

目錄 一、常用函數 1、 random.random() 2、random.uniform(a, b) 3、random.randint(a, b) 4、random.randrange(start, stop[, step]) 5、random.choice(sequence) 6、random.shuffle(x[, random]) 7、random.sample(population, k) 8、random.choices(population, w…

Qml:錨點

import QtQuick import QtQuick.WindowWindow {width: 800height: 600visible: truetitle: qsTr("Test Anchors")///錨點 上下左右Rectangle{id: anchor1width:200height: 150color:"#EEEEEE"Rectangle{id:rect1width:50height:50color: "red"Te…

Ubuntu 20/22 安裝 Jenkins

1. 使用 apt 命令安裝 Java Jenkins 作為一個 Java 應用程序&#xff0c;要求 Java 8 及更高版本&#xff0c;檢查系統上是否安裝了 Java。 sudo apt install -y openjdk-17-jre-headless安裝完成后&#xff0c;再次驗證 Java 是否已安裝 java --version2. 通過官方存儲庫安…