MySQL深入 鎖詳解

2021-10-19 09:43:51 字數 2562 閱讀 3573

鎖的定義:計算機協調多個程序或執行緒併發訪問某一資源的機制。但加鎖會消耗資源

共享鎖與排他鎖

樂觀鎖與悲觀鎖

表鎖、行鎖與頁鎖

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 開銷 加鎖速度 死鎖 粒度 併發效能 表鎖更適用於以查詢為主,只有少量按索引條件更新資料的應...