Mysql InnoDB存儲引擎的鎖相關

  • InnoDB下,mysql四個級別隔離下加鎖操做mysql

    • 四個級別隔離的寫操做都加X鎖
    • 串行化下讀加S鎖
    • select ... for update, select ... lock in share mode 分別加x鎖,s鎖
    • 在須要加鎖的場景下,會根據狀況使用三種加鎖策略(算法)
      • Record Lock
      • Gap Lock
      • Next-Key Lock
  • mysql RR 爲啥能隔離幻讀算法

    • 快照讀 select
    • 當前讀 select for update, select lock in share mode, delete,insert,update
  • InnoDB提供了一致性的非鎖定讀、行級鎖支持sql

  • Lock 與Latch數據庫

    • Lock 主要用於鎖定數據庫中的對象,如表、頁、行,而Latch主要是線程併發上的資源鎖定。
    • Latch的實現採用了樂觀spin-wait,因此在競爭比較激烈的併發環境下,性能不是很好,是一種輕量鎖。
    • Latch
      • mutex(互斥liang)
      • rwlock(讀寫鎖)
    • Lock
      • 行鎖、表鎖、頁鎖
      • 在沒有索引的狀況下,通常是鎖全表的全部行,而後逐行判斷解鎖
      • 沒有實現鎖升級
  • 行級鎖併發

    • 共享鎖(S Lock)
    • 排他鎖 (X Lock)
    • S與S兼容,而X與什麼都不兼容
  • 意向鎖(事務在更細的粒度上加鎖)性能

    • 意向共享鎖(IS Lock) ,事務想要得到一張表中某幾行的共享鎖
    • 意向排他鎖(IX Lock),事務想要得到一張表中某幾行的排他鎖
    • InnoDB的意向鎖是表級別的鎖
  • 一致性的非鎖定讀線程

    • 經過行多版本控制的方式來讀取當前執行時間數據中行的數據。
    • 若是當前行的X鎖已經被得到,那麼經過undo 段,來得到X鎖被得到前的快照,返回該快照的數據
    • 非鎖定讀,不須要X鎖的釋放就能夠進行操做。能夠等同於在事務開始時得到全局快照,在事務運行期間,不管其餘事務是否對數據進行提交,都不影響。
  • 一致性鎖定讀版本控制

    • SELECT...FOR UPDATE (加X鎖)
    • SELECT... LOCK IN SHARE MODE (加S鎖)
  • 自增加與鎖對象

    • SELECT MAX(auto_inc_col) FROM t FOR UPDATE;
  • 外鍵和鎖索引

    • 對外鍵值的插入和更新的時候,須要讀父表,這時不能採用一致的非鎖定讀,不然會出現子表與父表不一致的現象。因此須要採用一致性讀,也就是給父表加S鎖。
  • 行鎖的三種算法

    • Record Lock: 單個行記錄上的鎖
      • 鎖的是索引,若是沒有設置索引,那麼鎖的是主鍵
    • Gap Lock: 間隙鎖,鎖定一個範圍,不包含記錄自己
      *
    • Next-Key Lock: Gap Lock + Record Lock, 鎖定一個範圍,而且鎖定記錄自己
      • 惟一索引狀況下,降級爲Record Lock
  • InnoDB經過Next-key Lock避免了幻讀問題

    • 經過加兩個間隙鎖,來保證對於insert,delete操做不會形成幻讀
  • 全部隔離級別都實現了寫寫互斥

  • 四種隔離級別

    • 讀未提交
      • 讀讀不互斥、讀寫不互斥、寫寫互斥(不是沒有加鎖!!!!)
    • 讀已提交(一致性的非鎖定讀)
      • 讀讀不互斥、讀寫不互斥、寫寫互斥
      • 每次讀都是讀的最新快照 (避免了髒讀,經過undo log實現)
    • 可重複讀(一致性的非鎖定讀)
      • 讀讀不互斥、讀寫不互斥、寫寫互斥
      • 每次讀都是事務開始時的最新快照 (避免了髒讀,不可重複讀, 經過undo log實現)
    • 串行化
      • 讀讀不互斥、讀寫互斥、寫寫互斥
      • 讀讀加的是S鎖
      • 容易發生死鎖
  • 死鎖

    • 發生死鎖時,會自動回滾事務
相關文章
相關標籤/搜索