《MySQL——加鎖規則(待補全,有些沒看懂)》

catalog

    • 加鎖規則
    • 等值查詢間隙鎖
    • 非唯一索引等值鎖
    • 主鍵索引范圍鎖
    • 非唯一索引范圍鎖
    • 唯一索引范圍鎖 bug
    • 非唯一索引上存在"等值"的例子
    • limit語句加鎖
    • 關于死鎖

總結

1、查詢過程中訪問到的對象才會加鎖,而加鎖的基本單位是next-key lock(前開后閉);
2、等值查詢上MySQL的優化:索引上的等值查詢,如果是唯一索引,next-key lock會退化為行鎖,如果不是唯一索引,需要訪問到第一個不滿足條件的值,此時next-key lock會退化為間隙鎖;
3、范圍查詢:無論是否是唯一索引,范圍查詢都需要訪問到不滿足條件的第一個值為止;

加鎖規則

默認這里的隔離級別是可重復讀。
原則1:加鎖的基本單位是next-key lock。該鎖的區間是前開后閉
原則2:查找過程中訪問到的對象才會加鎖
優化1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock退化為行鎖
優化2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock退化為間隙鎖
bug:唯一索引上的范圍查詢會訪問到不滿足條件的第一個值為止。

建表語句:

CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `c` (`c`)
) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),
(10,10,10),(15,15,15),(20,20,20),(25,25,25);

等值查詢間隙鎖

在這里插入圖片描述

非唯一索引等值鎖

在這里插入圖片描述

session A給索引c上c=5這一行加上讀鎖。

根據原則1,加鎖單位是next-key lock ,因此會給(0,5]加上next-key lock.

c是普通索引,因此訪問c=5后還需要向右遍歷,查到c=10才放棄。

根據原則2,訪問到的都要加鎖,因此要給(5,10]加上next-key lock;

同時符合優化2:等值判斷,向右遍歷,最后一個值不滿足c=5,于是退化為間隙鎖(5,10);

(前面分析的(0, 5]間隙鎖還是存在的,合起來存在(0, 5]和(5, 10)兩個間隙鎖 )

根據原則2,只有訪問到的對象才會加鎖,這個查詢使用的是覆蓋索引,并不需要訪問主鍵索引,所以主鍵索引上沒有加任何鎖,所以session B的update語句可以執行完成。

**訪問到的對象才會加鎖,這個“對象”指的是列,不是 記錄行。 補充一下: 加鎖,是加在索引上的。 列上,有索引,就加在索引上; 列上,沒有索引,就加在主鍵上; **

session C要插入(7,7,7)記錄,會被session A 的間隙鎖(5,10)鎖住。

lock in share mode 只鎖覆蓋索引,for update 會順便給主鍵索引上滿足條件的行加上行鎖。

總結:

鎖是加在索引上的;

用lock in share mode 來給行加讀鎖避免數據被更新的話,就必須繞過覆蓋索引的優化,在查詢字段中加入索引中不存在的字段。

如將session A的語句:

select id from t where c=5 lock in share mode; 

修改為

select d from t where c = 5 lock in share mode;

數據行加讀鎖,如果查詢字段使用了覆蓋索引,訪問到的對象只有普通索引,并沒有訪問到主鍵索引,則不會鎖主鍵索引。如果沒有使用覆蓋索引,且當前查詢是for update ,update 和 delete 都是當前讀,則會回表查詢,訪問到主鍵索引,這樣主鍵索引也會加鎖。

主鍵索引范圍鎖

對于表t,有兩個查詢語句,這兩個語句加鎖范圍不同:

select * from t where id = 10 for update;
select * from t where id >= 10 and id < 11 for update;

這兩句話邏輯上等價,但是加鎖規則不一樣。
在這里插入圖片描述
執行流程:

1、找到第一個id=10的行,因此本該是next-key lock (5,10]。根據優化1,主鍵id上的等值條件,退化成行鎖,只加id = 10這一行的行鎖

2、范圍查找繼續往后找,找到id=15這一行停下來,因此需要加next-key lock (10,15].

所以,session A這時候鎖的范圍就是主鍵索引上,行鎖id = 10和next-key lock(10,15]。 因為是范圍查詢,不是等值查詢,所以不會進行優化2; 所以會出現B C的block情況。

需要注意 首次session A 定位查找id=10的行時候,是當作等值查詢來判斷的,而向右掃描到id=15的時候,用的是范圍查詢判斷。

--引用:
1. 先走主鍵id索引, 拿出id=10的那一行, (注意這里是等值查詢) 2. 再從id=10的那一行開始, 不斷地往右遍歷拿出每一行, 直到它的 id 不滿足 大于等于10, 小于11 這個條件后, 再停止 (注意這里就是范圍查詢) 根據一開始的Creae table/ insert values等語句(10后面就是15), 還有再根據加鎖規則(原則1, 原則2, 優化1, 優化2, bug5): 執行步驟1, 因為是等值查詢, 主鍵索引又是唯一索引, 根據原則1, 原則2, 優化1, 最終只加行鎖10; 執行步驟2, 因為是范圍查詢, 主鍵索引又是唯一索引, 根據原則1, 原則2, Bug5, 而不滿足條件的第一個值就是15, 所以最終要加鎖(10, 15]; 這一塊相對還是比較繁瑣的

非唯一索引范圍鎖

在這里插入圖片描述

唯一索引范圍鎖 bug

在這里插入圖片描述

非唯一索引上存在"等值"的例子

給表t插入一條新紀錄

insert into t values(30,10,30);

此時表里面就有了兩個c=10的行。 因為主鍵是唯一的, 所以不存在完全相同的兩行 ,此時的索引c為:
在這里插入圖片描述
兩個c=10,但是主鍵id不同(分別為10和30),因此這兩個c=10的記錄之間也是有間隙的。
這里使用delete語句來驗證。delete原則和之前update原則一樣。
在這里插入圖片描述
session A遍歷的時候,先訪問第一個c=10的記錄。根據原則1:這里加的是

(c = 5,id = 5) 到(c = 10,id = 10)這個next-key lock.

然后,session A向右查找,直到碰到(c=15,id=15)這一行,循環才結束。根據優化2,這是一個等值查詢,向右查找到了不滿足條件的行,所以會退化成(c=10,id=10)到(c=15,id=15)的間隙鎖。

也就是說,這個delete語句在索引c上的加鎖范圍,如下:
在這里插入圖片描述
注意(c=5,id=5)和(c=15,id=15)這兩行都沒有鎖。

limit語句加鎖

在這里插入圖片描述

關于死鎖

next-key lock實際上是間隙鎖和行鎖加起來的結果。

在這里插入圖片描述
分析流程:

1、session A啟動事務執行查詢語句加lock in share mode,在索引c上加了next-key lock(5,10]和間隙鎖(10,15);

2、session B的update語句在索引c上加next-key lock(5,10],進入鎖等待;

3、然后session A要再插入(8,8,8)這一行,被session B的間隙鎖鎖住。由于出現了死鎖,InnoDB讓session B回滾。

我們認為session B的加鎖還沒申請成功。

但是,其實session B的"加next-key lock(5,10]"操作實際上分成了兩步,先是加(5,10)的間隙鎖,加鎖成功;然后加c=10的行鎖,第二步才被鎖住。

也就是說我們分析加鎖的具體步驟時,需要分成間隙鎖和行鎖兩段來執行。

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

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

相關文章

c# 命名空間命名規范_C#中的命名空間

c# 命名空間命名規范C&#xff03;命名空間 (C# Namespace ) In C# namespaces are used to group similar type of classes. Two classes with same name in different namespaces never conflict to each other. 在C&#xff03;中&#xff0c;名稱空間用于對相似類型的類進…

PHP環境搭建:Windows 7下安裝配置PHP+Apache+Mysql環境教程

這兩天剛裝好Windows 7&#xff0c;碰巧前段時間有朋友問我Windows下如何安裝搭建PHP環境&#xff0c;所以打算勤勞下&#xff0c;手動一步步搭建PHP環境&#xff0c;暫且不使用PHP環境搭建軟件了&#xff0c;在此詳細圖解在Windows 7下安裝配置PHPApacheMysql環境的教程&#…

《MySQL—— 業務高峰期的性能問題的緊急處理的手段 》

catalog短連接風暴先處理占著連接但是不工作地線程減少連接過程的消耗慢查詢性能問題索引沒有設計好語句沒寫好選錯索引QPS突增問題短連接風暴 正常的短連接&#xff1a; 執行很少sql語句就斷開&#xff0c;下次需要的時候再重連。MySQL建立連接的過程成本很高&#xff0c;包含…

sql 算出下級銷售總和_找出總和字符串

sql 算出下級銷售總和Description: 描述&#xff1a; This is a standard interview problem to check that the given string is a sum string or not using backtracking. 這是一個標準的面試問題&#xff0c;用于檢查給定的字符串是否為總和字符串或不使用回溯。 Problem…

Request 分別獲取具有相同 name 屬性表單元素值

html 中是允許多個具有相同name屬性的元素的&#xff0c;例如 <div> <input name"txtName" id"txtFirstName" type"text" /> <input name"txtName" id"txtMiddleName" type"text" /> <input…

《MySQL——redo log 與 binlog 寫入機制》

目錄binlog寫入機制redo log寫入機制組提交機制實現大量的TPS理解WAL機制如何提升IO性能瓶頸WAL機制告訴我們&#xff1a;只要redo log與binlog保證持久化到磁盤里&#xff0c;就能確保MySQL異常重啟后&#xff0c;數據可以恢復。 下面主要記錄一下MySQL寫入binlog和redo log的…

BBIAB的完整形式是什么?

BBIAB&#xff1a;再回來一點 (BBIAB: Be Back In A Bit) BBIAB is an abbreviation of "Be Back In A Bit". BBIAB是“ Be Back in A Bit”的縮寫 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites lik…

字符串:KMP Eentend-Kmp 自動機 trie圖 trie樹 后綴樹 后綴數組

涉及到字符串的問題&#xff0c;無外乎這樣一些算法和數據結構&#xff1a;自動機 KMP算法 Extend-KMP 后綴樹 后綴數組 trie樹 trie圖及其應用。當然這些都是比較高級的數據結構和算法&#xff0c;而這里面最常用和最熟悉的大概是kmp&#xff0c;即使如此還是有相當一部分人也…

WPF CanExecuteChanged

繼承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主備一致性六問六答》

目錄備庫為什么要設置為只讀模式&#xff1f;備庫設置為只讀&#xff0c;如何與主庫保持同步更新&#xff1f;A到B的內部流程如何&#xff1f;binlog內容是什么&#xff1f;row格式對于恢復數據有何好處M-M結構的循環復制問題以及解決方案備庫為什么要設置為只讀模式&#xff1…

代碼管理工具

http://blogs.msdn.com/b/visualstudio/archive/2012/06/11/world-of-samples-at-your-fingertips.aspx轉載于:https://www.cnblogs.com/hebeiDGL/archive/2012/09/25/2700961.html

fyi 在郵件里是什么意思_FYI的完整形式是什么?

fyi 在郵件里是什么意思僅供參考&#xff1a;供您參考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替換 vmwp

要激活 Hyper-V 下的虛機 最簡單的方法是用帶證書的vmwp替換掉原來的 帶證書的vmwp參見&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下載后腰替換 先把 Hyper-V 的倆服務停止掉 然后找到 C:\Windows\System32\vmwp.exe 右鍵--安全 替換掉所有者 然后給自己…

《MySQL——主備切換流程與主備延遲》

目錄主備切換主備延遲的原因可靠性優先策略的主備切換流程可用性優先策略的主備切換流程主備切換 主備切換分為主動運維與被動操作。 軟件升級、主庫所在機器按計劃下線為主動運維。 主庫所在機器掉電為被動操作。 同步延遲 1、主庫A執行完一個事務&#xff0c;寫入binlog…

ejb模式_EJB的完整形式是什么?

ejb模式EJB&#xff1a;企業Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多書中都沒有對PreferenceActivity做介紹&#xff0c;而我正好又在項目中用到&#xff0c;所以就把自己的使用的在這總結一下&#xff0c;也方便日后查找。 PerferenceActivity是什么&#xff0c;看下…

淺談算法和數據結構: 七 二叉查找樹

前文介紹了符號表的兩種實現&#xff0c;無序鏈表和有序數組&#xff0c;無序鏈表在插入的時候具有較高的靈活性&#xff0c;而有序數組在查找時具有較高的效率&#xff0c;本文介紹的二叉查找樹(Binary Search Tree&#xff0c;BST)這一數據結構綜合了以上兩種數據結構的優點。…

scala部分應用函數_Scala中的部分函數

scala部分應用函數Scala部分功能 (Scala partial functions) A partial function is a function that returns values only for a specific set of values i.e. this function is not able to return values for some input values. This function is defined so that only som…

《MySQL——備庫多線程復制策略。》

目錄備庫并行復制能力MySQL5.6版本 并行復制策略MariaDB 并行復制策略MySQL5.7版本 并行復制策略MySQL5.7.22版本 并行復制策略總結備庫并行復制能力 主要涉及兩個方面的并行度&#xff1a; 1、客戶端寫入主庫的能力 2、備庫上sql_thread執行中轉日志relay log 1的并行能力…

人臉是門大生意

我們正處在一個新時代的入口。人有70%的能量是被大腦消耗&#xff0c;大腦90%的能量用來處理視覺信息&#xff0c;人臉則承載了絕大部分的視覺信息。我們要討論的是一個比Google Glass更酷的世界。文/程苓峰-云科技網易郵箱的用戶已經可以用人臉而不是密碼來驗證登陸。安卓4.0實…