成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文搞懂MySQL行鎖、表鎖、間隙鎖詳解

數據庫 MySQL
今天我們來講講MySQL的各種鎖,這里存儲引擎我們使用InnoDB。

前言

我們前幾篇講了索引是什么,如何使用explain分析索引使用情況,如何去優化索引,以及show profiles分析SQL語句執行資源消耗的學習。今天我們來講講MySQL的各種鎖,這里存儲引擎我們使用InnoDB

準備工作

創建表 tb_innodb_lock 

  1. drop table if exists test_innodb_lock;  
  2. CREATE TABLE test_innodb_lock (  
  3.     a INT (11),  
  4.     b VARCHAR (20)  
  5. ) ENGINE INNODB DEFAULT charset = utf8 
  6. insert into test_innodb_lock values (1,'a');  
  7. insert into test_innodb_lock values (2,'b');  
  8. insert into test_innodb_lock values (3,'c');  
  9. insert into test_innodb_lock values (4,'d');  
  10. insert into test_innodb_lock values (5,'e'); 

創建索引 

  1. create index idx_lock_a on test_innodb_lock(a);  
  2. create index idx_lock_b on test_innodb_lock(b); 

MySQL 各種鎖演示

  •  先將自動提交事務改成手動提交:set autocommit=0;
  •  我們啟動兩個會話窗口 A 和 B,模擬一個搶到鎖,一個沒搶到被阻塞住了。

行鎖(寫&讀)

  • A 窗口執行 
  1. update test_innodb_lock set b='a1' where a=1 
  1. SELECT * from test_innodb_lock; 

我們可以看到 A 窗口可以看到更新后的結果

  •  B 窗口執行 
  1. SELECT * from test_innodb_lock; 

我們可以看到 B 窗口不能看到更新后的結果,看到的還是老數據,這是因為 a = 1 的這行記錄被 A 窗口執行的 SQL 語句搶到了鎖,并且沒有執行 commit 提交操作。所以窗口 B 看到的還是老數據。這就是 MySQL 隔離級別中的"讀已提交"。

  •  窗口 A 執行 commit 操作 
  1. COMMIT; 
  •  窗口 B 查詢 
  1. SELECT * from test_innodb_lock; 

這個時候我們發現窗口 B 已經讀取到最新數據了

行鎖(寫&寫)

  •  窗口 A 執行更新 a = 1 的記錄 
  1. update test_innodb_lock set b='a2' where a=1

這時候并沒有 commit 提交,鎖是窗口 A 持有。

  •  窗口 B 也執行更新 a = 1 的記錄 
  1. update test_innodb_lock set b='a3' where a=1

可以看到,窗口 B 一直處于阻塞狀態,因為窗口 A 還沒有執行 commit,還持有鎖。窗口 B 搶不到 a = 1 這行記錄的鎖,所以一直阻塞等待。

  •  窗口 A 執行 commit 操作 
  1. COMMIT; 

    窗口 B 的變化

可以看到這個時候窗口 B 已經執行成功了

表鎖

當索引失效的時候,行鎖會升級成表鎖,索引失效的其中一個方法是對索引自動 or 手動的換型。a 字段本身是 integer,我們加上引號,就變成了 String,這個時候索引就會失效了。

  •  窗口 A 更新 a = 1 的記錄 
  1. update test_innodb_lock set b='a4' where a=1 or a=2
  •  窗口 B 更新 a = 2 的記錄 
  1. update test_innodb_lock set b='b1' where a=3

這個時候發現,雖然窗口 A 和 B 更新的行不一樣,但是窗口 B 還是被阻塞住了,就是因為窗口 A 的索引失效,導致行鎖升級成了表鎖,把整個表鎖住了,索引窗口 B 被阻塞了。

  •  窗口 A 執行 commit 操作 
  1. COMMIT; 
  •  窗口 B 的變化

可以看到這個時候窗口 B 已經執行成功了

間隙鎖

  •  什么是間隙鎖

當我們采用范圍條件查詢數據時,InnoDB 會對這個范圍內的數據進行加鎖。比如有 id 為:1、3、5、7 的 4 條數據,我們查找 1-7 范圍的數據。那么 1-7 都會被加上鎖。2、4、6 也在 1-7 的范圍中,但是不存在這些數據記錄,這些 2、4、6 就被稱為間隙。

  • 間隙鎖的危害

范圍查找時,會把整個范圍的數據全部鎖定住,即便這個范圍內不存在的一些數據,也會被無辜的鎖定住,比如我要在 1、3、5、7 中插入 2,這個時候 1-7 都被鎖定住了,根本無法插入 2。在某些場景下會對性能產生很大的影響

  •  間隙鎖演示

我們先把字段 a 的值修改成 1、3、5、7、9

  •  窗口 A 更新 a = 1~7 范圍的數據 
  1. update test_innodb_lock set b='b5' where a>1 and a<7
  •  窗口 B 在 a = 2 的位置插入數據 
  1. insert into test_innodb_lock values(2, "b6"); 

這個時候發現窗口 B 更新 a = 2 的操作一直在等待,因為 1~7 范圍的數據被間隙鎖,鎖住了。只有等窗口 A 執行 commit,窗口 B 的 a = 2 才能更新成功

行鎖分析

  •  執行 SQL 分析命令 
  1. show status like 'innodb_row_lock%'; 

  •  Variable_name 說明
    •  Innodb_row_lock_current_waits:當前正在等待鎖定的數量。
    •  Innodb_row_lock_time:從系統啟動到現在鎖定的時長。
    •  Innodb_row_lock_time_avg:每次等待鎖所花平均時間。
    •  Innodb_row_lock_time_max:從系統啟動到現在鎖等待最長的一次所花的時間。
    •  Innodb_row_lock_waits:系統啟動后到現在總共等待鎖的次數。

結語

大家可以根據 Variable_name 這幾個參數考慮是否要進行優化,如果鎖定時間,鎖定次數過大,那就該考慮優化了。優化手段可以參考之前索引優化的文章。 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2023-11-06 08:35:08

表鎖行鎖間隙鎖

2025-06-04 02:55:00

MySQL意向鎖記錄鎖

2024-11-29 07:38:12

MySQL數據庫

2023-12-06 07:33:20

MySQL鎖事間隙鎖

2025-02-10 09:58:48

2010-05-24 12:50:59

MySQL表級鎖

2018-07-31 10:10:06

MySQLInnoDB死鎖

2021-12-14 08:10:00

MySQL行鎖間隙鎖

2020-07-02 08:22:56

MySQL間隙鎖過行鎖

2024-03-04 00:01:00

鎖表鎖行MySQL

2024-01-16 12:19:08

MySQL重要機制高并發

2024-06-14 09:27:00

2022-10-24 00:33:59

MySQL全局鎖行級鎖

2022-07-20 08:06:57

MySQL表鎖Innodb

2022-10-24 08:02:14

MySQL索引類型

2020-02-06 10:02:45

MySQL數據庫全局鎖

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2019-01-04 11:18:35

獨享鎖共享鎖非公平鎖

2025-04-28 02:22:00

2010-11-22 14:27:05

MySQL鎖表
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成av在线| 国产精品视频网 | 国产免费一区 | 国产乱码精品1区2区3区 | 91精品国产综合久久久久蜜臀 | 日韩av免费看 | 久久久久久久一区二区 | 国产精品一区久久久 | 精品欧美色视频网站在线观看 | 婷婷激情综合 | 国产精品国产三级国产aⅴ浪潮 | 国产精品美女久久久久aⅴ国产馆 | 国产在线观看一区二区三区 | 欧美高清视频 | 91福利电影在线观看 | 国产精品3区 | 精品中文字幕一区二区三区 | 日韩伦理一区二区三区 | 国产欧美一区二区久久性色99 | 久久久久久国模大尺度人体 | av日韩在线播放 | 久操伊人| 九九久视频| 精品综合| 日本人麻豆| 亚洲色图综合网 | 午夜影院在线观看 | 中文字幕在线中文 | 91极品尤物在线播放国产 | 欧美区日韩区 | 久久高清免费视频 | 日本精品在线观看 | av中文在线播放 | 最新国产精品精品视频 | 亚洲美女网站 | 欧美在线观看一区 | 日本不卡一区 | 国产高清免费在线 | 亚洲一级视频在线 | 天天操网 | 中文字幕欧美一区 |