鎖的定義:計算機協調多個程序或執行緒併發訪問某一資源的機制。但加鎖會消耗資源
共享鎖與排他鎖
樂觀鎖與悲觀鎖
表鎖、行鎖與頁鎖
next-key lock:行鎖+間隙鎖,在rr隔離級別下,next-key lock 演算法是預設的行記錄鎖定演算法。
record lock:單個行記錄上的鎖,record lock總是會去鎖住索引記錄,如果innodb儲存引擎表建立的時候沒有設定任何乙個索引,這時innodb儲存引擎會使用隱式的主鍵來進行鎖定
意向鎖:表示在未來的某個時刻,事務可能要加共享/排它鎖了,先提前宣告乙個意向。是表級別的鎖。
快照讀與當前讀
插入意向鎖(insert intention lock):只會和間隙或者 next-key 鎖衝突,防止其他事務插入記錄造成幻讀。
全域性鎖:flush tables with read lock (ftwrl)命令可以加全域性讀鎖
表級鎖:分為表鎖和元資料鎖(meta data lock,mdl)
定義:針對資料表中行記錄的鎖。例如事務a更新了一行,而這時候事務b也要更新同一行,則必須等事務a的操作完成後才能進行更新。innodb引擎支援行鎖,而myisam不支援行鎖。
行鎖分類:
鎖型別xixs
isxconflict
conflict
conflict
conflict
ixconflict
compatible
conflict
compatible
sconflict
conflict
compatible
compatible
isconflict
compatible
compatible
compatible
兩階段鎖協議:
行鎖示例
# 建表語句
drop
table
ifexists
`article`
;create
table
`article`
(`id`
bigint(20
)unsigned
notnull
default0,
`title`
varchar
(255
)not
null
default'',
`hits`
int(11)
notnull
default0,
primary
key(
`id`),
key`idx_title`
(`title`))
engine
=innodb
default
charset
=utf8mb4;
# 產生行鎖的sql1
update article set hits =
10where id =49;
# 產生行鎖的sql2
解決熱點行更新導致的效能問題
行鎖小結
間隙鎖定義:用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引加鎖,對於鍵值在條件範圍內但並不存在的記錄。解決了事務併發的幻讀問題
間隙鎖的兩個原則與優化
在刪除資料的時候盡量加limit。這樣不僅可以控制刪除資料的條數,讓操作更安全,還可以減小加鎖的範圍
提高效能的方法
死鎖定義:當併發系統中不同執行緒出現迴圈資源依賴,涉及的執行緒都在等待別的執行緒釋放資源時,就會導致這幾個執行緒都進入無限等待的狀態。關鍵是兩個(或以上)的session加鎖的順序不一致。
死鎖策略:
避免死鎖的方法
當事務需要加鎖的時,如果這個鎖不可能發生衝突,innodb會跳過加鎖環節,這種機制稱為隱式鎖。
隱式鎖是innodb實現的一種延遲加鎖機制,其特點是只有在可能發生衝突時才加鎖,從而減少了鎖的數量,提高了系統整體效能。
隱式鎖是針對被修改的b+ tree記錄,因此都是記錄型別的鎖,不可能是間隙鎖或next-key型別。
隱式鎖主要用在插入場景,在特殊情況下,才會將隱式鎖轉換為顯示鎖,例如事務1插入記錄且未提交,此時事務2嘗試對該記錄加鎖,那麼事務2必須先判斷記錄上儲存的事務id是否活躍,如果活躍則幫助事務1建立乙個鎖物件,而事務2自身進入等待事務1的狀態。
查詢鎖狀態 select * from performance_schema.data_locks;
參考
分析innodb的加鎖過程
innodb locking
mysql中的鎖機制
innodb讀寫鎖實現分析
mysql行鎖詳解 詳解MySQL行鎖
鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。鎖保證資料併發訪問的一致性 有效性 鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。鎖是mysql在伺服器層和儲存引擎層的的併發控制。mysql中從對資料操作的粒度分為表鎖和行鎖。表鎖是指對一整張表加鎖,一般是 ddl 處理時使用 而行鎖則是鎖定...
詳解mysql間隙鎖
1.什麼是間隙鎖?1 對於鍵值在條件範圍內但並不存在的記錄 在相等條件下請求給乙個不存在的記錄也會加鎖 叫做 間隙 gap innodb也會對這個 間隙 加鎖,這種鎖機制就是所謂的間隙鎖 next key鎖 2 查詢使用的範圍條件不是相等條件,innodb會給符合條件的已有資料記錄的索引項加鎖 2....
MySQL中鎖詳解
相對於其他的資料庫而言,mysql的鎖機制比較簡單,最顯著的特點就是不同的儲存引擎支援不同的鎖機制。根據不同的儲存引擎,mysql中鎖的特性可以大致歸納如下 行鎖表鎖 頁鎖myisam bdb innodb 開銷 加鎖速度 死鎖 粒度 併發效能 表鎖更適用於以查詢為主,只有少量按索引條件更新資料的應...