全面瞭解Mysql(八)鎖

  1. 鎖是數據庫中很重要的存在,但是也是最不怎麼需要維護的,全篇基本都是概念性的,也是我最討厭的知識點。

  2. mysql中分爲lock和latch鎖,我們常說的是lock,而latch是管理mysql線程的,不怎麼需要維護。
    在這裏插入圖片描述
    通過上圖我們可以看出latch 等待次數。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述上面的圖可以看出lock的一些信息

  3. innodb中的鎖
    共享鎖(S Lock)允許讀一行數據
    排他鎖(X Lock)允許事務修改一行數據
    意向共享鎖(IS Lock)事務想要獲取共享鎖,獲取共享鎖時必須已有IS鎖
    意向排他鎖(IX Lock)事務想要獲取排他鎖,獲取排他鎖時必須已有IX鎖
    在這裏插入圖片描述數據庫在進行相關操作前必須獲得相應的鎖纔可以操作,意向鎖的目的是爲了讓數據庫提前知道要安排的鎖,除了全表掃描外,意向鎖不會阻塞任何請求。
    當有事務正在執行修改操作,會進行上x鎖,這個時候如果需要讀該行數據,就會去undo log中讀取一個快照數據,這個被稱爲一致性非鎖定讀,可以加快數據庫訪問速度,這個讀不需要上S鎖的,所以沒有衝突。
    mysql對應外鍵,如果沒有加索引,innodb會默認添加索引,避免表鎖。
    mysql中行鎖有3種算法,1)Record lock單個行記錄上鎖,2)Gap lock間隙鎖,鎖定一個範圍,但不包含記錄本身,3)Next-key lock 上兩個鎖的綜合,鎖定一個範圍包括自身。innodb使用的是Next-key lock,當查詢的索引含有唯一屬性是會使用Record lock,這樣可以解決Phantom problem(同一事務下,連續兩次同樣sql結果不同,就是幻讀)使用範圍上鎖可避免不同事務處理同一記錄的情況。

  4. 數據庫的鎖可能帶來的問題
    1)髒讀,如果讀到了一個事務未提交的數據就叫髒讀,這個違反了數據庫的隔離性,READ UNCOMMITTED模式下可能會出現這個問題
    2)幻讀,不可重複讀,同一事務下,連續兩次同樣sql結果不同,和髒讀區別再有事務提交了。Next-key lock 可以避免該問題出現。

  5. 引入鎖後,阻塞問題
    innodb設置了參數innodb_lock_wait_timeout用來控制等待的時間,默認50s,參數innodb_rollback_on_timeout等待超時回滾操作 。

  6. 引入鎖後,死鎖問題
    數據庫使用wait-for graph(等待圖)來進行死鎖檢測,通過所得信息鏈表和事務等待鏈表構造出一張圖,如果存在迴路就會產生死鎖,一般來說當檢測到死鎖時,innodb會選擇回滾undo量最小的事務進行回滾。

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