文章總共分爲五個部分:html
大而全版(五合一):InnoDB的鎖機制淺析(All in One)數據庫
本章的兼容矩陣是後面死鎖解決的基礎。ui
數據事務設計遵循ACID的原則:
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫,必需要具備這四種特性,不然在事務過程(Transaction processing)當中沒法保證數據的正確性。設計
MySQL數據庫提供了四種默認的隔離級別,讀未提交(read-uncommitted)、讀已提交(或不可重複讀)(read-committed)、可重複讀(repeatable-read)、串行化(serializable)。code
MySQL的默認隔離級別是RR。htm
InnoDB實現了兩種標準行級鎖,一種是共享鎖(shared locks,S鎖),另外一種是獨佔鎖,或者叫排它鎖(exclusive locks,X鎖)。blog
S鎖容許當前持有該鎖的事務讀取行。
X鎖容許當前持有該鎖的事務更新或刪除行。事務
若是事務T1持有了行r上的S鎖
,則其餘事務能夠同時持有行r的S鎖
,可是不能對行r加X鎖
。ci
若是事務T1持有了行r上的X鎖
,則其餘任何事務不能持有行r的X鎖
,必須等待T1在行r上的X鎖
釋放。get
若是事務T1在行r上保持S鎖
,則另外一個事務T2對行r的鎖的請求按以下方式處理:
X鎖
,必須等待其餘事務對該行添加的S鎖
或X鎖
的釋放。InnoDB支持多種粒度的鎖,容許行級鎖和表級鎖的共存。例如LOCK TABLES ... WRITE
等語句能夠在指定的表上加上獨佔鎖。
InnoBD使用意向鎖來實現多個粒度級別的鎖定。意向鎖是表級鎖,表示table中的row所須要的鎖(S鎖或X鎖)的類型。
意向鎖分爲意向共享鎖(IS鎖)和意向排它鎖(IX鎖)。
IS鎖表示當前事務意圖在表中的行上設置共享鎖,下面語句執行時會首先獲取IS鎖,由於這個操做在獲取S鎖:
SELECT ... LOCK IN SHARE MODE
IX鎖表示當前事務意圖在表中的行上設置排它鎖。下面語句執行時會首先獲取IX鎖,由於這個操做在獲取X鎖:
SELECT ... FOR UPDATE
事務要獲取某個表上的S鎖和X鎖以前,必須先分別獲取對應的IS鎖和IX鎖。
鎖的兼容矩陣以下:
--- | 排它鎖(X) | 意向排它鎖(IX) | 共享鎖(S) | 意向共享鎖(IS) |
---|---|---|---|---|
排它鎖(X) | N | N | N | N |
意向排它鎖(IX) | N | OK | N | OK |
共享鎖(S) | N | N | OK | OK |
意向共享鎖(IS) | N | OK | OK | OK |
按照上面的兼容性,若是不一樣事務之間的鎖兼容,則當前加鎖事務能夠持有鎖,若是有衝突則會等待其餘事務的鎖釋放。
若是一個事務請求鎖時,請求的鎖與已經持有的鎖衝突而沒法獲取時,互相等待就可能會產生死鎖。
意向鎖不會阻止除了全表鎖定請求以外的任何鎖請求。 意向鎖的主要目的是顯示事務正在鎖定某行或者正意圖鎖定某行。