1.什麼是鎖: 對共用資源進行併發訪問,提供數據的完整性和一致性。 2.鎖的區別: Lock Manager的哈希表中 latch是針對程式內部的資源(比如:全局變數)的鎖的定義,而這裡的lock針對的是資料庫的事務。 lock有latch來保證和實現。 3.鎖是用來實現併發控制,併發控制用來實現隔 ...
1.什麼是鎖:
對共用資源進行併發訪問,提供數據的完整性和一致性。
2.鎖的區別:
類型 | lock | latch |
對象 | 事務 | 線程 |
保護 | 資料庫內容 | 記憶體數據結構 |
持續時間 | 整個事務過程 | 臨界資源 |
模式 | 行鎖、表鎖、意向鎖 | 讀寫鎖、互斥量 |
死鎖 | 通過waits-for graph、time out等機制進行死鎖檢測與處理 | 無死鎖檢測與處理機制。僅通過應用程式加鎖的順序(latch leveling)保證無死鎖的情況發生。 |
存在於 |
Lock Manager的哈希表中 |
每個數據結構對象中 |
latch是針對程式內部的資源(比如:全局變數)的鎖的定義,而這裡的lock針對的是資料庫的事務。
lock有latch來保證和實現。
3.鎖是用來實現併發控制,併發控制用來實現隔離級別,隔離級別是通過鎖來控制的,鎖的目的為了使得事務之間的執行是序列化的。
4. 什麼是隔離性
一個事務所做的修改,對其它事務時不可見的,好似是串列執行的。
隔離級別越低,事務請求的鎖越少或者保持鎖的時間就越短。
5.MySQL事務的隔離級別
事務隔離級別 | 臟讀 | 不可重覆讀 | 幻讀 |
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重覆讀(read-committed) | 否 | 是 | 是 |
可重覆讀(repeatable-read) | 否 | 否 | 是 |
串列化(serializable) | 否 | 否 | 否 |
MySQL 預設的事務隔離級別為repeatable-read。
6.什麼是臟讀、不可重覆讀、幻讀
(1)臟讀:事務A讀取了事務B更新(插入)的數據,然後B回滾操作,那麼A讀取的數據是臟數據。即尚未提交(commit)的數據,被其他的事務讀取了。
(2)不可重覆讀:事務A多次讀取同一數據(同一條記錄),事務B在事務A多次讀取的過程中,對數據做了更新並提交,導致事務A多次讀取同一數據時,結果不一致。
(3)幻讀:在同一個事務中,執行兩次相同的SQL,等到不同的結果集,(新增了部分記錄或者缺失了部分記錄)(與不可重覆讀操作對象不一樣,此處,不是同一條記錄)。
小結:不可重覆讀和幻讀很容易混淆,不可重覆讀偏重於修改,幻讀側重於新增或刪除。解決不可重覆讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。
7.MySQL InnoDB支持三種行鎖定方式
Record Lock 單個行記錄上的鎖;
Gap Lock 鎖定一個範圍,但不包含記錄本身;間隙鎖是針對事務隔離級別為可重覆讀或以上級別,解決了幻讀的問題。locking reads,UPDATE和DELETE時,除了對唯一索引的唯一搜索外都會獲取gap鎖或next-key鎖。即鎖住其掃描的範圍。
Next-Key Lock Gap Lock + Record Lock,鎖定一個範圍,並且鎖定記錄本身。
8.(1)事務隔離級別為讀提交時,寫數據只會鎖住相應的行。
(2)事務隔離級別為可重覆讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新數據時會鎖住整張表。一個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。
(3)事務隔離級別為串列化時,讀寫數據都會鎖住整張表
(4)隔離級別越高,越能保證數據的完整性和一致性,但是對併發性能的影響也越大。
9.間隙鎖鎖定的區域
根據檢索條件向左尋找最靠近檢索條件的記錄值A,作為左區間,向右尋找最靠近檢索條件的記錄值B作為右區間,即鎖定的間隙為(A,B)。
10.死鎖
死鎖是兩個或兩個以上的事務在執行過程中,因爭奪鎖資源而造成的一種互相等待的現象。
我們一般通過鎖超時機制來解決死鎖。參數為--innodb_lock_timeout. 而設置innodb_print_all_deadlocks 可決定是否將死鎖信息列印到err_log中。