mysql innodb鎖機制

1.概述
所謂表級鎖,它直接鎖住的是一個表,開銷小,加鎖快,不會出現死鎖的情況,鎖定粒度大,發生鎖衝突的概率更高,併發度最低。
所謂行級鎖,它直接鎖住的是一條記錄,開銷大,加鎖慢,發生鎖衝突的概率較低,併發度很高。
所謂頁級鎖,它是鎖住的一個頁面,它的開銷介於表級鎖和行級鎖中間,也可能會出現死鎖,鎖定粒度也介於表級鎖和行級鎖中間,併發度也介於表級鎖和行級鎖中間。innodb的頁大小一般爲16k。
行級鎖更適合大量按照索引條件併發更新少量不同的數據,同時還有併發查詢的應用

2.行級鎖的分類
InnoDB有兩種類型的行級鎖,兩種內部使用的意向鎖;
共享鎖(S):允許一個事務讀一行數據時,阻止其他的事務讀取相同數據的排他鎖。
排他鎖(X):允許獲得排他鎖的事務更新數據,阻止其他事務取得相同數據的共享鎖和排他鎖。
意向共享鎖(IS):事務打算給數據行加行共享鎖。事務在給一個數據行加共享鎖前必須先取得該表的IS鎖。
意向排他鎖(IX):事務打算給數據行加行排他鎖。事務在給一個數據行加排他鎖前必須先取得該表的IX鎖。
悲觀鎖(抽象,不真實存在的鎖)
樂觀鎖(抽象,不真實存在的鎖)
在這裏插入圖片描述
共享鎖語句
select * from table_name lock in share mode;
排他鎖語句
select * from table_name for update;

3.排它鎖,以及鎖粒度的實例
innodb既支持行級鎖又支持表級鎖。當sql語句有檢索條件而且使用到索引才表現爲行級鎖,否則是表級鎖。
創建測試表:
CREATE TABLE articles (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
title varchar(200) DEFAULT NULL,
body text,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
插入測試數據:
INSERT INTO test.articles (id, title, body) VALUES (‘1’, ‘山水’, ‘阿發達大大’);
INSERT INTO test.articles (id, title, body) VALUES (‘2’, ‘國畫’, ‘阿斯頓發送到發大東方’);
執行窗體1:
給title=‘山水’加上排它鎖(x)
在這裏插入圖片描述
執行窗體2:
在這裏插入圖片描述
表現:發現窗體2正在等待窗體1鎖的等待。
結論:因爲沒有給title加任何索引,因此窗體1的sql鎖住了整個表。
現在給title加上普通索引
alter table articles add index idx_title(title);
重複以上窗體1,窗體2,步驟
在這裏插入圖片描述
表現:發現窗體2執行成功
結論:給title加上普通索引,因此窗體1的sql鎖住了title='山水’的數據,不會影響到窗體2title = '國畫’的更新語句。因此也可以說明,行級鎖的併發比較大。

4.自動加鎖的情況
普通查詢select語句不會加任何鎖,
update,delete,insert語句會自動加上排它鎖(x)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章