MySQL:行鎖、表鎖、樂觀鎖、悲觀鎖、讀鎖、寫鎖

一、鎖的分類數據庫

  1.1從對數據操做的類型來分併發

    讀鎖(共享鎖):針對同一份數據,多個讀操做能夠同時進行而不會互相影響。    性能

      結論1:
      --若是某一個會話 對A表加了read鎖,則 該會話 能夠對A表進行讀操做、不能進行寫操做; 且 該會話不能對其餘表進行讀、寫操做。
      --即若是給A表加了讀鎖,則當前會話只能對A表進行讀操做。spa

      結論2:
      會話0給A表加了鎖;其餘會話的操做:a.能夠對其餘表(A表之外的表)進行讀、寫操做
      b.對A表:讀-能夠; 寫-須要等待釋放鎖。、進程

      某回話給某個表加了讀鎖,全部的回話都能對該表進行讀操做,不能進行寫操做,除非該會話釋放讀鎖。it

    寫鎖(排它鎖):當前寫操做沒有完成前,它會阻斷其餘寫鎖和讀鎖。    io

      當前會話(會話0) 能夠對加了寫鎖的表 進行任何操做(增刪改查);可是不能 操做(增刪改查)其餘表
      其餘會話:對會話0中加寫鎖的表 能夠進行增刪改查的前提是:等待會話0釋放寫鎖請求

2.2鎖粒度劃分。數據

通常分爲:行鎖、表鎖、庫鎖關係型數據庫

(1)行鎖:訪問數據庫的時候,鎖定整個行數據,防止併發錯誤。 如InnoDB存儲引擎使用行鎖

(2)表鎖訪問數據庫的時候,鎖定整個表數據,防止併發錯誤。 如MyISAM存儲引擎使用表鎖

行鎖 和 表鎖 的區別:

  • 表鎖: 開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突機率高,併發度最低
  • 行鎖: 開銷大,加鎖慢;會出現死鎖;鎖定粒度小,發生鎖衝突的機率低,併發度高

2. 3  補充   悲觀鎖 和 樂觀鎖

(1)悲觀鎖:顧名思義,就是很悲觀,每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。

(2)樂觀鎖: 顧名思義,就是很樂觀,每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量,像數據庫若是提供相似於write_condition機制的其實都是提供的樂觀鎖。

(3)悲觀鎖 和 樂觀鎖的區別:

  • 樂觀鎖在不發生取鎖失敗的狀況下開銷比悲觀鎖小,可是一旦發生失敗回滾開銷則比較大,所以適合用在取鎖失敗機率比較小的場景,能夠提高系統併發性能
  • 樂觀鎖還適用於一些比較特殊的場景,例如在業務操做過程當中沒法和數據庫保持鏈接等悲觀鎖沒法適用的地方

小結:

MySQL表級鎖的鎖模式MyISAM在執行查詢語句(SELECT)前,會自動給涉及的全部表加讀鎖,在執行更新操做(DML)前,會自動給涉及的表加寫鎖。因此對MyISAM表進行操做,會有如下狀況:a、對MyISAM表的讀操做(加讀鎖),不會阻塞其餘進程(會話)對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,纔會執行其它進程的寫操做。b、對MyISAM表的寫操做(加寫鎖),會阻塞其餘進程(會話)對同一表的讀和寫操做,只有當寫鎖釋放後,纔會執行其它進程的讀寫操做。

相關文章
相關標籤/搜索