AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

select...for update,表鎖?行鎖?間隙鎖?

來源: 責編: 時間:2023-11-06 08:52:26 277觀看
導讀大家好呀,我是樓仔。對于這個問題,我 4 年前就專門研究過,最近看到網上很多相關的文章,要么總結得不全,要么存在很多問題。感覺有必要自己寫一篇,一方面對網上的知識進行糾偏,另一方面也想全面總結一下這塊知識,方便大家學習

大家好呀,我是樓仔。oGf28資訊網——每日最新資訊28at.com

對于這個問題,我 4 年前就專門研究過,最近看到網上很多相關的文章,要么總結得不全,要么存在很多問題。oGf28資訊網——每日最新資訊28at.com

感覺有必要自己寫一篇,一方面對網上的知識進行糾偏,另一方面也想全面總結一下這塊知識,方便大家學習。oGf28資訊網——每日最新資訊28at.com

這篇文章應該是全網總結最全的,如果有發現比我這篇寫得更好,更全,一定要私我哈。oGf28資訊網——每日最新資訊28at.com

不 BB,上文章目錄:oGf28資訊網——每日最新資訊28at.com

圖片圖片oGf28資訊網——每日最新資訊28at.com

01 環境準備

在驗證之前,我們先準備好具體的環境和數據,事務隔離級別 RR,數據庫版本 5.7.26。oGf28資訊網——每日最新資訊28at.com

為了方便測試,索引都是整型:oGf28資訊網——每日最新資訊28at.com

CREATE TABLE user (  id int(11) unsigned NOT NULL AUTO_INCREMENT,  user_no int(11) NOT NULL COMMENT '用戶編號',  user_name varchar(16) DEFAULT NULL COMMENT '用戶名',  age int(3) DEFAULT NULL COMMENT '年齡',  PRIMARY KEY (id),  UNIQUE KEY un_idx_user_no (user_no),  KEY idx_age (age)) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

初始化數據:oGf28資訊網——每日最新資訊28at.com

insert into user values(1, 10, '樓仔', 18);insert into user values(4, 15, '二哥', 28);insert into user values(8, 20, '一灰', 38);

常用命令操作:oGf28資訊網——每日最新資訊28at.com

> start transaction; // 開啟事務> commit; // 提交事務> rollback; // 回滾事務> select @@transaction_isolation; // 查看事務隔離級別> select @@version; // 查看數據庫版本> SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; //  查詢鎖

02 場景分類

2.1 主鍵(有值)

說明:主鍵查詢,查詢數據存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where id = 1 for update;

執行更新操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

update user set user_name = "樓仔小弟" where id = 1;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

查看鎖信息:oGf28資訊網——每日最新資訊28at.com

圖片圖片oGf28資訊網——每日最新資訊28at.com

  • lock_mode 為 X(排他鎖)
  • lock_type 為 RECORD,行級鎖

結論:查詢條件為主鍵,且有值,行鎖oGf28資訊網——每日最新資訊28at.com

2.2 主鍵(空值)

操作:主鍵查詢,查詢數據不存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where id = 2 for update;

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 28);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

這里的間隙鎖,鎖住的區間是 id 字段的 (1,4) 區間,查看鎖信息:oGf28資訊網——每日最新資訊28at.com

圖片圖片oGf28資訊網——每日最新資訊28at.com

  • lock_mode 為 X(排他鎖)+ Gap(間隙鎖)
  • lock_type 為 RECORD,行級鎖

結論:查詢條件為主鍵,且空值,間隙鎖oGf28資訊網——每日最新資訊28at.com

2.3 唯一索引(有值)

說明:唯一索引查詢,數據存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where user_no = 10 for update;

執行更新操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

update user set user_name = "樓仔小弟" where user_no = 10;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片圖片oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為唯一索引,且有值,行鎖oGf28資訊網——每日最新資訊28at.com

2.4 唯一索引(空值)

說明:唯一索引查詢,數據不存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where user_no = 11 for update;

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 28);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

這里的間隙鎖,鎖住的區間是 user_no 字段的 (1,4) 區間。oGf28資訊網——每日最新資訊28at.com

圖片圖片oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為唯一索引,且空值,間隙鎖oGf28資訊網——每日最新資訊28at.com

2.5 普通索引(有值)

說明:普通索引,數據存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where age = 18 for update;

執行更新操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

update user set user_name = "樓仔小弟" where age = 18;ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片圖片oGf28資訊網——每日最新資訊28at.com

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 20);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片圖片oGf28資訊網——每日最新資訊28at.com

這里鎖住的是 age 字段的 [18, 28) 這區間。oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為普通索引,且有值,間隙鎖oGf28資訊網——每日最新資訊28at.com

2.6 普通索引(空值)

說明:普通索引,數據不存在。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where age = 19 for update;

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 20);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片圖片oGf28資訊網——每日最新資訊28at.com

這里鎖住的是 age 字段的 (18, 28) 這區間。oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為普通索引,且空值,間隙鎖oGf28資訊網——每日最新資訊28at.com

2.7 索引(范圍查詢)

說明:這里的索引,包括主鍵索引、唯一索引和普通索引。oGf28資訊網——每日最新資訊28at.com

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where id > 1 for update;

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 20);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片圖片oGf28資訊網——每日最新資訊28at.com

這里其實可以對 id = 1 的數據進行更新,對于其它數據,都被鎖住,鎖住的范圍是 id 字段的 (1, 4],(4, 8],(8, 正無窮) 區間。oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為索引,且是范圍查詢,間隙鎖。oGf28資訊網——每日最新資訊28at.com

2.8 無索引

執行悲觀鎖查詢:oGf28資訊網——每日最新資訊28at.com

select * from user where user_name = "樓仔" for update;

執行插入操作,被鎖住了:oGf28資訊網——每日最新資訊28at.com

insert into user values(3, 14, '樓仔小弟', 20);ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

圖片oGf28資訊網——每日最新資訊28at.com

這里明顯是鎖表了,但是為什么鎖的信息還是行鎖呢,知道的同學,可以私我哈~~oGf28資訊網——每日最新資訊28at.com

結論:查詢條件為無索引,表鎖。oGf28資訊網——每日最新資訊28at.com

03 加鎖規則

3.1 規律總結

我們把上面的結論進行匯總:oGf28資訊網——每日最新資訊28at.com

圖片圖片oGf28資訊網——每日最新資訊28at.com

總結如下規律:oGf28資訊網——每日最新資訊28at.com

  1. 當查詢條件為主鍵和唯一索引,當有值時,是行鎖;
  2. 當查詢條件為主鍵和唯一索引,當為空值時,是間隙鎖;
  3. 當查詢條件為普通索引,是間隙鎖;
  4. 當查詢條件為索引,且為范圍查詢,是間隙鎖;
  5. 當查詢條件無索引,是表鎖。

3.2 加鎖規則

那是否有一套加鎖規則呢?oGf28資訊網——每日最新資訊28at.com

為了便于大家理解,我先普及 3 個概念:oGf28資訊網——每日最新資訊28at.com

  • Record Lock:行鎖
  • Gap Lock:間隙鎖,鎖定一個范圍,但不包含記錄本身
  • Next-Key Lock:行鎖 + 間隙鎖,左開右閉,比如(1,5]

其實 MySQL 大佬林曉斌在極客時間講過,后來也有很多博主轉發過他的加鎖規則,我直接把這套規則貼一下。oGf28資訊網——每日最新資訊28at.com

兩個“原則”:oGf28資訊網——每日最新資訊28at.com

  • 原則 1:加鎖的基本單位是 next-key lock,其中 next-key lock 是前開后閉區間;
  • 原則 2:查找過程中訪問到的對象才會加鎖。

兩個“優化”:oGf28資訊網——每日最新資訊28at.com

  • 優化 1:索引上的等值查詢,給唯一索引加鎖的時候,next-key lock退化為行鎖;
  • 優化 2:索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。

3.3 分析一下

這里我們結合上面的案例,來解讀這套加鎖規則。oGf28資訊網——每日最新資訊28at.com

針對我們前面總結的 5 條規律,我們先分析這兩條:oGf28資訊網——每日最新資訊28at.com

  • 當查詢條件為主鍵和唯一索引,當有值時,是行鎖;
  • 當查詢條件為主鍵和唯一索引,當為空值時,是間隙鎖。

下面我們根據 “兩個原則” + “兩個優化” 來分析一下。oGf28資訊網——每日最新資訊28at.com

根據 “原則 1”,加鎖的基本單位是 next-key lock,當 “索引上為等值查詢” 時(即能查到該數據),根據 “優化 1”,間隙鎖退化為行鎖。oGf28資訊網——每日最新資訊28at.com

同理,根據 “優化 2”,索引上的等值查詢,向右遍歷時且最后一個值不滿足等值條件的時候,next-key lock 退化為間隙鎖。oGf28資訊網——每日最新資訊28at.com

再分析這兩條:oGf28資訊網——每日最新資訊28at.com

  • 當查詢條件為普通索引,是間隙鎖;
  • 當查詢條件為索引,且為范圍查詢,是間隙鎖;

同上,通過 “原則 1” 和 “優化 2”,普通索引 是加的間隙鎖。oGf28資訊網——每日最新資訊28at.com

對于范圍查詢,個人認為上面的規則還不能完全覆蓋,當時林曉斌針對這些規則,舉了 4 個示例,然后進行詳細剖析,包括間隙鎖的范圍區間計算。oGf28資訊網——每日最新資訊28at.com

因為篇幅原因,這里就不再詳細展開,如果后續需要,我也可能會單獨出一篇。oGf28資訊網——每日最新資訊28at.com

04 寫在最后

最后我們再回顧一下(RR 隔離級別):oGf28資訊網——每日最新資訊28at.com

  1. 當查詢條件為主鍵和唯一索引,當有值時,是行鎖;
  2. 當查詢條件為主鍵和唯一索引,當為空值時,是間隙鎖;
  3. 當查詢條件為普通索引,是間隙鎖;
  4. 當查詢條件為索引,且為范圍查詢,是間隙鎖;
  5. 當查詢條件無索引,是表鎖。

至于間隙鎖的范圍,如何計算,本文沒有詳細闡述,但是上面的這些規則,就能基本滿足我們日常工作需要。oGf28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-17150-0.htmlselect...for update,表鎖?行鎖?間隙鎖?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 2023年WebAssembly 現狀

下一篇: 高性能Python開發:解密FastAPI的高并發秘籍!

標簽:
  • 熱門焦點
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 三分鐘白話RocketMQ系列—— 如何發送消息

    我們知道RocketMQ主要分為消息 生產、存儲(消息堆積)、消費 三大塊領域。那接下來,我們白話一下,RocketMQ是如何發送消息的,揭秘消息生產全過程。注意,如果白話中不小心提到相關代
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • iQOO 11S屏幕細節公布:首發三星2K E6全感屏 安卓最好的直屏手機

    日前iQOO手機官方宣布,新一代電競旗艦iQOO 11S將會在7月4日19:00正式與大家見面。隨著發布時間的日益臨近,官方關于該機的預熱也更加密集,截至目前已
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • 引領旗艦級影像能力向中端機普及 OPPO K11 系列發布 1799 元起

    7月25日,OPPO正式發布K系列新品—— OPPO K11 。此次 K11 在中端手機市場長期被忽視的影像板塊發力,突破性地搭載索尼 IMX890 旗艦大底主攝,支持 OIS
  • SN570 NVMe SSD固態硬盤 價格與性能兼具

    SN570 NVMe SSD固態硬盤是西部數據發布的最新一代WD Blue系列的固態硬盤,不僅閃存技術更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top