1.什麼是鎖:數據庫
對共享資源進行併發訪問控制,提供數據的完整性和一致性。session
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中。
(If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.)