MySQL之InnoDB鎖機制

2021-10-13 09:02:07 字數 2159 閱讀 3435

innodb儲存引擎實現了如下兩種標準的行級鎖:

共享鎖(s lock):允許事務讀一行資料。

排他鎖(x lock):允許事務刪除或更新一行資料。

如果乙個事務 t1 已經獲得了行 r 的共享鎖,那麼另外的事務 t2 可以立即獲得行 r 的共享鎖,因為讀取並沒有改變行 r 的資料,稱這種情況為鎖相容。但若有其他的事務 t3 想獲得行 r 的排他鎖,則其必須等待事務t1、t2釋放行 r 上的共享鎖這種情況稱為鎖不相容。即共享鎖不互斥獲取,排他鎖互斥獲取。

接下來我們考慮這樣乙個問題:

事務a鎖住了表中的一行,讓這一行只能讀,不能寫。之後,事務b申請整個表的寫鎖。如果事務b申請成功,那麼理論上它就能修改表中的任意一行,這與a持有的行鎖是衝突的。資料庫需要避免這種衝突,就是說要讓b的申請被阻塞,直到a釋放了行鎖。

為了解決這個衝突,資料庫需要做兩個判斷:

判斷表是否已被其他事務用表鎖鎖表;

判斷表中的每一行是否已被行鎖鎖住。

由於第二個判斷條件效率低下,因此引入了意向鎖的機制。

意向鎖是為了解決程式執行高效性問題,並不是為了多併發下資料的一致性問題。

innodb 儲存引擎支援多粒度鎖定,這種鎖定允許事務在行級上的鎖和表級上的鎖同時存在。為了支援在不同粒度上進行加鎖操作,innodb 儲存引擎支援一種額外的鎖方式,稱之為意向鎖。意向鎖是將鎖定的物件分為多個層次,意向鎖意味著事務希望在更細粒度上進行加鎖。

意向鎖分為兩種:

意向共享鎖(is lock):事務想要獲得一張表中某幾行的共享鎖;

意向排他鎖(ix lock):事務想要獲得- -張表中某幾行的排他鎖。

首先讓我們看看資料庫資料儲存結構的層次圖:

有了意向鎖後,考慮1.2中我們所說的情況,事務a必須先申請表的意向共享鎖,成功後再申請一行的行鎖。此時,如果事務b要申請整個表的寫鎖,判斷條件就變成如下兩個條件:

判斷表是否已被其他事務用表鎖鎖表(不變);

發現表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,因此,事務b申請表的寫鎖會被阻塞。

注意:意向鎖(ix,is)是表級鎖,不會和行級的排他鎖(x)或 共享鎖(s)發生衝突。只會和表級的鎖(x,s)發生衝突; 行級別的x和s按照普通的共享、排他規則即可。只要寫操作不是同一行,就不會發生衝突。

資料庫在針對多併發問題,提出了多版本控制的概念;核心原理是:

寫任務發生時,將資料轉殖乙份,以版本號區分;

寫任務操作新轉殖的資料,直至提交;

併發讀任務可以繼續讀取舊版本的資料,不至於阻塞;

如上圖所示:

最開始資料的版本是v0;

t1時刻發起了乙個寫任務,這是把資料clone了乙份,進行修改,版本變為v1,但任務還未完成;

t2時刻併發了乙個讀任務,依然可以讀v0版本的資料;

t3時刻又併發了乙個讀任務,依然不會阻塞;

可以看到,資料多版本,通過「讀取舊版本資料」能夠極大提高任務的併發度。

此外,某些情況下,我們需要顯式地對資料庫讀取操作,進行加鎖以保證資料邏輯的一致性,這要求資料庫支援加鎖語句,

持加鎖語句,即使是對於select的唯讀操作。innodb儲存引擎對於select語句支

持兩種一致性的鎖定讀 (locking read)操作:

1. select … for update

2. select … lock in share mode

select…for update對讀取的行記錄加乙個x鎖,其他事務不能對已鎖定的行加上任何鎖。select…lock in share mode對讀取的行記錄加乙個s鎖,其他事務可以向被鎖定的行加s鎖,但是如果加x鎖,則會被阻塞。

對於一致性非鎖定讀,即使讀取的行已被執行了select…for update,也是可以進行讀取的,這和之前討論的情況一樣。此外,select…for update, select…lock in share mode必須在乙個事務中,當事務提交了,鎖也就釋放了。因此在使用.上述兩句select鎖定語句時,務必加上begin, start transaction或者set autocommit=0。

InnoDB之鎖機制

前兩天聽了姜老大關於innodb中鎖的相關培訓,剛好也在看這方面的知識,就順便利用時間把這部分知識做個整理,方便自己理解。主要分為下面幾個部分 1.innodb同步機制 innodb儲存引擎有兩種同步機制選擇,一種是mutex,其是完全的互斥方法。另一種是rw lock,可以給臨界資源加上s lat...

InnoDB之鎖機制

前兩天聽了姜老大關於innodb中鎖的相關培訓,剛好也在看這方面的知識,就順便利用時間把這部分知識做個整理,方便自己理解。主要分為下面幾個部分 1.innodb同步機制 innodb儲存引擎有兩種同步機制選擇,一種是mutex,其是完全的互斥方法。另一種是rw lock,可以給臨界資源加上s lat...

Mysql中那些鎖機制之InnoDB

我們知道mysql在以前,儲存引擎預設是myisam,但是隨著對事務和併發的要求越來越高,便引入了innodb引擎,它具有支援事務安全等一系列特性。innodb實現了兩種型別的行鎖。共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,但是...