7、 MySQL锁机制:数据库核心技术之一
為了保證數據并發訪問時的一致性和有效性,任何一個數據庫都存在鎖機制。
鎖機制的優劣直接影響到數據庫的并發處理能力和系統性能,所以鎖機制也就成為了各種數據庫的核心技術之一。
鎖機制是為了解決數據庫的并發控制問題而產生的。如在同一時刻,客戶端對同一個表做更新或查詢操作,為了保證數據的一致性,必須對并發操作進行控制。同時,鎖機制也為實現 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 表示互斥。
如果一個事務請求的鎖模式與當前的鎖兼容,InnoDB 就將請求的鎖授予該事務;反之,如果兩者不兼容,該事務就要等待鎖釋放。
為了盡可能提高數據庫的并發量,需每次鎖定的數據范圍越小越好,越小的鎖其耗費的系統資源越多,系統性能下降。為在高并發響應和系統性能兩方面進行平衡,這樣就產生了“鎖粒度”的概念。
總結
以上是生活随笔為你收集整理的7、 MySQL锁机制:数据库核心技术之一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6、MySQL查看和修改事务隔离级别
- 下一篇: 8、MySQL表锁、行锁和页锁