一、鎖的分類數據庫
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表的寫操做(加寫鎖),會阻塞其餘進程(會話)對同一表的讀和寫操做,只有當寫鎖釋放後,纔會執行其它進程的讀寫操做。