InnoDB的鎖機制淺析(一)—基本概念/兼容矩陣

InnoDB鎖的基本概念

文章總共分爲五個部分:html

大而全版(五合一):InnoDB的鎖機制淺析(All in One)數據庫

1. 前言

本章的兼容矩陣是後面死鎖解決的基礎。ui

數據事務設計遵循ACID的原則:
原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。一個支持事務(Transaction)的數據庫,必需要具備這四種特性,不然在事務過程(Transaction processing)當中沒法保證數據的正確性。設計

MySQL數據庫提供了四種默認的隔離級別,讀未提交(read-uncommitted)、讀已提交(或不可重複讀)(read-committed)、可重複讀(repeatable-read)、串行化(serializable)。code

MySQL的默認隔離級別是RR。htm

2. 鎖基本概念

2.1 共享鎖和排它鎖

InnoDB實現了兩種標準行級鎖,一種是共享鎖(shared locks,S鎖),另外一種是獨佔鎖,或者叫排它鎖(exclusive locks,X鎖)。blog

S鎖容許當前持有該鎖的事務讀取行。
X鎖容許當前持有該鎖的事務更新或刪除行。事務

S鎖

若是事務T1持有了行r上的S鎖,則其餘事務能夠同時持有行r的S鎖,可是不能對行r加X鎖ci

X鎖

若是事務T1持有了行r上的X鎖,則其餘任何事務不能持有行r的X鎖,必須等待T1在行r上的X鎖釋放。get

若是事務T1在行r上保持S鎖,則另外一個事務T2對行r的鎖的請求按以下方式處理:

  • T2能夠同時持有S鎖
  • T2若是想在行r上獲取X鎖,必須等待其餘事務對該行添加的S鎖X鎖的釋放。

2.2 意向鎖-Intention Locks

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鎖。

2.3 鎖的兼容性

鎖的兼容矩陣以下:

--- 排它鎖(X) 意向排它鎖(IX) 共享鎖(S) 意向共享鎖(IS)
排它鎖(X) N N N N
意向排它鎖(IX) N OK N OK
共享鎖(S) N N OK OK
意向共享鎖(IS) N OK OK OK

按照上面的兼容性,若是不一樣事務之間的鎖兼容,則當前加鎖事務能夠持有鎖,若是有衝突則會等待其餘事務的鎖釋放。

若是一個事務請求鎖時,請求的鎖與已經持有的鎖衝突而沒法獲取時,互相等待就可能會產生死鎖。

意向鎖不會阻止除了全表鎖定請求以外的任何鎖請求。 意向鎖的主要目的是顯示事務正在鎖定某行或者正意圖鎖定某行。

相關文章
相關標籤/搜索