為了保證資料並行存取時的一致性和有效性,任何一個資料庫都存在鎖機制。鎖機制的優劣直接影響到資料庫的併行處理能力和系統效能,所以鎖機制也就成為了各種資料庫的核心技術之一。
鎖機制是為了解決資料庫的並行控制問題而產生的。如在同一時刻,用戶端對同一個表做更新或查詢操作,為了保證資料的一致性,必須對並行操作進行控制。同時,鎖機制也為實現 MySQL 的各個隔離級別提供了保證。
可以將鎖機制理解為使各種資源在被並行存取時變得有序所設計的一種規則。
如何保證資料並行存取的一致性、有效性是所有資料庫必須解決的一個問題,鎖衝突也是影響資料庫並行存取效能的一個重要因素。從這個角度來說,鎖對資料庫顯得尤其重要,也更加複雜。本節我們先簡單介紹一下鎖機制及常見的鎖型別。
按鎖級別分類,可分為共用鎖、排他鎖和意向鎖。也可以按鎖粒度分類,可分為行級鎖、表級鎖和頁級鎖。下面我們先介紹共用鎖、排他鎖和意向鎖。
1. 共用鎖
共用鎖的代號是 S,是 Share 的縮寫,也可稱為讀鎖。是一種可以檢視但無法修改和刪除的資料鎖。
共用鎖的鎖粒度是行或者元組(多個行)。一個事務獲取了共用鎖之後,可以對鎖定範圍內的資料執行讀操作。會阻止其它事務獲得相同資料集的排他鎖。
2. 排他鎖
排他鎖的代號是 X,是 eXclusive 的縮寫,也可稱為寫鎖,是基本的鎖型別。
排他鎖的粒度與共用鎖相同,也是行或者元組。一個事務獲取了排他鎖之後,可以對鎖定範圍內的資料執行寫操作。允許獲得排他鎖的事務更新資料,阻止其它事務取得相同資料集的共用鎖和排他鎖。
如有兩個事務 A 和 B,如果事務 A 獲取了一個元組的共用鎖,事務 B 還可以立即獲取這個元組的共用鎖,但不能立即獲取這個元組的排他鎖,必須等到事務 A 釋放共用鎖之後才可以。
如果事務 A 獲取了一個元組的排他鎖,事務 B 不能立即獲取這個元組的共用鎖,也不能立即獲取這個元組的排他鎖,必須等到 A 釋放排他鎖之後才可以。
3. 意向鎖
為了允許行鎖和表鎖共存,實現多粒度鎖機制,InnoDB 還有兩種內部使用的意向鎖。
意向鎖是一種表鎖,鎖定的粒度是整張表,分為意向共用鎖(IS)和意向排他鎖(IX)兩類。
意向共用鎖表示一個事務有意對資料上共用鎖或者排他鎖。“有意”表示事務想執行操作但還沒有真正執行。
鎖和鎖之間的關係,要麼是相容的,要麼是互斥的。
-
鎖 a 和鎖 b 相容是指:操作同樣一組資料時,如果事務 t1 獲取了鎖 a,另一個事務 t2 還可以獲取鎖 b;
-
鎖 a 和鎖 b 互斥是指:操作同樣一組資料時,如果事務 t1 獲取了鎖 a,另一個事務 t2 在 t1 釋放鎖 a 之前無法釋放鎖 b。
鎖模式的相容情況
其中共用鎖、排他鎖、意向共用鎖、意向排他鎖相互之間的相容/互斥關係如下表所示,其中 Y 表示相容,N 表示互斥。
引數 |
X |
S |
IX |
IS |
X(排他鎖) |
N |
N |
N |
N |
S(共用鎖) |
N |
Y |
N |
Y |
IX(意向排他鎖) |
N |
N |
Y |
Y |
IS(意向共用鎖) |
N |
Y |
Y |
Y |
如果一個事務請求的鎖模式與當前的鎖相容,InnoDB 就將請求的鎖授予該事務;反之,如果兩者不相容,該事務就要等待鎖釋放。
為了盡可能提高資料庫的並行量,需每次鎖定的資料範圍越小越好,越小的鎖其耗費的系統資源越多,系統效能下降。為在高並行響應和系統效能兩方面進行平衡,這樣就產生了“鎖粒度”的概念。