中文字幕第五页-中文字幕第页-中文字幕韩国-中文字幕最新-国产尤物二区三区在线观看-国产尤物福利视频一区二区

MySQLInnoDB中的鎖機制深入講解

寫在前面

創新互聯公司主要從事成都網站制作、網站設計、網頁設計、企業做網站、公司建網站等業務。立足成都服務根河,十余年網站建設經驗,價格優惠、服務專業,歡迎來電咨詢建站服務:18980820575

數據庫本質上是一種共享資源,因此在最大程度提供并發訪問性能的同時,仍需要確保每個用戶能以一致的方式讀取和修改數據。鎖機制(Locking)就是解決這類問題的最好武器。

首先新建表 test,其中 id 為主鍵,name 為輔助索引,address 為唯一索引。

CREATE TABLE `test` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` int(11) NOT NULL,
 `address` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `idex_unique` (`address`),
 KEY `idx_index` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;

INSERT 方法中的行鎖

MySQL InnoDB中的鎖機制深入講解

可見,如果兩個事務先后對主鍵相同的行記錄執行 INSERT 操作,因為事務 A 先拿到了行鎖,事務 B 只能等待直到事務 A 提交后行鎖被釋放。同理,如果針對唯一索引字段 address 進行插入操作,也需要獲取行鎖,圖同主鍵插入過程類似,不再重復。

但是,如果兩個事務都針對輔助索引字段 name 進行插入,不需要等待獲取鎖,因為輔助索引字段即使值相同,在數據庫中也是操作不同的記錄行,不會沖突。

Update 方法與 Insert 方法結果類似。

SELECT FOR UPDATE 下的表鎖與行鎖

MySQL InnoDB中的鎖機制深入講解

事務 A SELECT FOR UPDATE 語句會拿到表 test 的 Table Lock,此時事務 B 去執行插入操作會阻塞,直到事務 A 提交釋放表鎖后,事務 B 才能獲取對應的行鎖執行插入操作。

但是如果事務 A 的 SELECT FOR UPDATE 語句緊跟 WHERE id = 1 的話,那么這條語句只會獲取行鎖,不會是表鎖,此時不阻塞事務 B 對于其他主鍵的修改操作

輔助索引下的間隙鎖

先看下 test 表下的數據情況:

MySQL> select * from test;
+----+------+---------+
| id | name | address |
+----+------+---------+
| 3 | 1 |  3 |
| 6 | 1 |  2 |
| 7 | 2 |  4 |
| 8 | 10 |  5 |
+----+------+---------+
4 rows in set (0.00 sec)

間隙鎖可以說是行鎖的一種,不同的是它鎖住的是一個范圍內的記錄,作用是避免幻讀,即區間數據條目的突然增減。解決辦法主要是:

  • 防止間隙內有新數據被插入,因此叫間隙鎖
  • 防止已存在的數據,在更新操作后成為間隙內的數據(例如更新 id = 7 的 name 字段為 1,那么 name = 1 的條數就從 2 變為 3)

InnoDB 自動使用間隙鎖的條件為:

  • Repeatable Read 隔離級別,這是 MySQL 的默認工作級別
  • 檢索條件必須有索引(沒有索引的話會走全表掃描,那樣會鎖定整張表所有的記錄)

當 InnoDB 掃描索引記錄的時候,會首先對選中的索引行記錄加上行鎖,再對索引記錄兩邊的間隙(向左掃描掃到第一個比給定參數小的值, 向右掃描掃描到第一個比給定參數大的值, 以此構建一個區間)加上間隙鎖。如果一個間隙被事務 A 加了鎖,事務 B 是不能在這個間隙插入記錄的。

我們這里所說的 “間隙鎖” 其實不是 GAP LOCK,而是 RECORD LOCK + GAP LOCK,InnoDB 中稱之為 NEXT_KEY LOCK

下面看個例子,我們建表時指定 name 列為輔助索引,目前這列的取值有 [1,2,10]。間隙范圍有 (-∞, 1]、[1,1]、[1,2]、[2,10]、[10, +∞)

Round 1:

  • 事務 A SELECT ... WHERE name = 1 FOR UPDATE;
  • 對 (-∞, 2) 增加間隙鎖
  • 事務 B INSERT ... name = 1 阻塞
  • 事務 B INSERT ... name = -100 阻塞
  • 事務 B INSERT ... name = 2 成功
  • 事務 B INSERT ... name = 3 成功

Round 2:

  • 事務 A SELECT ... WHERE name = 2 FOR UPDATE;
  • 對 [1, 10) 增加間隙鎖
  • 事務 B INSERT ... name = 1 阻塞
  • 事務 B INSERT ... name = 9 阻塞
  • 事務 B INSERT ... name = 10 成功
  • 事務 B INSERT ... name = 0 成功

Round 3:

  • 事務 A SELECT ... WHERE name <= 2 FOR UPDATE;
  • 對 (-∞, +∞) 增加間隙鎖
  • 事務 B INSERT ... name = 3 阻塞
  • 事務 B INSERT ... name = 300 阻塞
  • 事務 B INSERT ... name = -300 阻塞

InnoDB 鎖機制總結

MySQL InnoDB中的鎖機制深入講解

參考資料

  • 《MySQL 技術內幕 InnoDB 存儲引擎》第二版 姜承堯著
  • About MySQL InnoDB's Lock

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對創新互聯的支持。

文章名稱:MySQLInnoDB中的鎖機制深入講解
分享網址:http://www.2m8n56k.cn/article14/jphsge.html

成都網站建設公司_創新互聯,為您提供小程序開發微信公眾號虛擬主機定制網站服務器托管網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 亚洲欧美中文日韩在线v日本 | 日本男人的天堂 | 亚洲欧洲无码一区二区三区 | 成人做爰网站免费看 | 美女个护士一级毛片亚洲 | 国产精品怡红院在线观看 | 国产三级精品播放 | www.日本高清 | 日韩精品欧美国产精品亚 | 久久综久久美利坚合众国 | 免费女人18毛片a级毛片视频 | 永久黄网站色视频免费观看99 | 国产免费一级精品视频 | 精品400部自拍视频在线播放 | 久久免费精品一区二区 | 亚洲精品无码专区在线播放 | 亚洲一区中文 | 国产专区一va亚洲v天堂 | 免费黄网大全 | 殴美一级视频 | 九九在线观看精品视频6 | 日韩中文字幕视频在线 | a在线观看欧美在线观看 | 国产精品亚洲一区二区在线观看 | 国产99视频精品免费视频免里 | 欧美激情免费a视频 | 亚洲在线观看视频 | 成人a一级毛片免费看 | 免费看v片网站 | 亚洲成人7777 | 国产在线观看精品一区二区三区91 | 日本欧美一级aaaaa毛片 | 精品成人免费一区二区在线播放 | 日本视频播放免费线上观看 | 午夜三级成人三级 | 国产亚洲精品免费 | 男人干女人的视频 | 日本免费一区二区三区a区 日本免费一区二区三区看片 | 精品国产福利 | 亚洲最新在线视频 | 国产精品久久毛片蜜月 |