前言:
Mysql是一個支持插件式存儲引擎的數據庫系統,本文討論的鎖機制也主要包含兩部分SERVER層的鎖和存儲引擎的鎖,存儲引擎是指innodb,其它存儲引暫不討論。
1. 數據庫中鎖相關的基本概念
1) 樂觀鎖,悲觀鎖
樂觀鎖和悲觀鎖都是一種並發控制策略。悲觀鎖假定多個事務會同時訪問同一個資源,采用的策略是“先上鎖,後訪問”,這種策略會有死鎖的風險。樂觀鎖相對於悲觀鎖而言,假定多個事務在運行過程中不會相互影響,寫入在讀取和寫入記錄時,不上鎖,取而代之是產生一個時間戳或版本號,事務提交階段,檢查記錄的版本號是否有被修改(若修改,則表示有其他事務讀寫),確定是否需要回滾事務。目前在數據庫領域,幾乎所有的DBMS都是采用悲觀鎖機制。
2) MVCC(Multi-Version Concurrency Control)
MVCC也是一種並發控制方法,MVCC對悲觀鎖控制機制做了改進,通過冗余數據的歷史版本,達到“讀不上鎖,讀寫不沖突”的效果,提高了並發效果。MVCC主要作用於讀提交和可重復讀兩種隔離級別上。
3) 兩階段鎖協議
所謂兩段鎖協議是指上鎖分為兩個階段,加鎖和解鎖階段,保證加鎖和解鎖階段不交錯。對於數據庫系統而言,事務開始時,處於加鎖階段;事務提交或rollback時,事務進入解鎖階段。只有滿足兩段鎖協議的數據庫系統,並發調度的事務才是可以串行化的。
4) 意向鎖
意向鎖機制約定如果對一個節點加鎖,必需先對它的上一層節點加意向鎖。比如,對一個記錄加鎖之前,首先對該記錄所在的表加意向鎖。意向鎖主要包括IS和IX,他們與S和X的兼容關系不在這裡贅述。意向鎖的主要作用在於提高表鎖和行鎖沖突檢測效率。
5) 表鎖,記錄(行)鎖
表鎖和記錄鎖是鎖系統裡面最基本的鎖。分別用於鎖定表和記錄。對於表而言,根據情況可以有S,X,IS和IX四種鎖類別;對表上IS和IX,表示需要讀記錄和寫記錄;記錄鎖則主要包括X鎖和S鎖。有關行鎖的實現,可以參考之前的文章,INNODB行鎖源碼學習
6) 字典鎖(metadata lock)
字典鎖是保護元數據的一種鎖,主要為了防止DDL和DML沖突的情況。有關MDL的詳細介紹,可以參考之前的文章,MYSQL METADATA LOCK
7) 死鎖