mysql的共享鎖(S)、排他鎖(X)、意向共享鎖(IS)、意向排他鎖(IX)的關係

一.S鎖和X鎖:S鎖和X鎖都屬於行數

  兼容性 加鎖方式
S鎖:共享鎖 加了S鎖的記錄,允許其他事務再加S鎖,不允許其他事務再加X鎖 select…lock in share mode
X鎖:排他鎖 加了X鎖的記錄,不允許其他事務再加S鎖或者X鎖 select…for update

二.意向鎖:表鎖,相互兼容,表明“某個事務持有了鎖、或準備去持有鎖”

1、意向鎖的存在是爲了協調行鎖和表鎖的關係,支持多粒度(表鎖與行鎖)的鎖並存。

2:
1)意向共享鎖(IS鎖):事務在請求S鎖前,要先獲得IS鎖
2)意向排他鎖(IX鎖):事務在請求X鎖前,要先獲得IX鎖

3、例子:事務A修改user表的記錄r,會給記錄r上一把行級的排他鎖(X),同時會給user表上一把意向排他鎖(IX),這時事務B要給user表上一個表級的排他鎖就會被阻塞。意向鎖通過這種方式實現了行鎖和表鎖共存且滿足事務隔離性的要求。

q1:爲什麼意向鎖是表級鎖呢?

當我們需要加一個排他鎖時,需要根據意向鎖去判斷表中有沒有數據行被鎖定(行鎖);

(1)如果意向鎖是行鎖,則需要遍歷每一行數據去確認;

(2)如果意向鎖是表鎖,則只需要判斷一次即可知道有沒數據行被鎖定,提升性能。

q2:意向鎖怎麼支持表鎖和行鎖並存?

(1)首先明確並存的概念是指數據庫同時支持表、行鎖,而不是任何情況都支持一個表中同時有一個事務A持有行鎖、又有一個事務B持有表鎖,因爲表一旦被上了一個表級的寫鎖,肯定不能再上一個行級的鎖。
(2)如果事務A對某一行上鎖,其他事務就不可能修改這一行。這與“事務B鎖住整個表就能修改表中的任意一行”形成了衝突。所以,沒有意向鎖的時候,讓行鎖與表鎖共存,就會帶來很多問題。於是有了意向鎖的出現,如q1的答案中,數據庫不需要在檢查每一行數據是否有鎖,而是直接判斷一次意向鎖是否存在即可,能提升很多性能。

三.下圖表示意向鎖和共享鎖、排他鎖的兼容關係。

1.當事務A對某個數據範圍(行或表)上了“某鎖”後,另一個事務B是否能在這個數據範圍上“某鎖”。
2.意向鎖相互兼容,因爲IX、IS只是表明申請更低層次級別元素(比如 page、記錄)的X、S操作。
3.表級S鎖和X、IX鎖不兼容:因爲上了表級S鎖後,不允許其他事務再加X鎖。
4.表級X鎖和 IS、IX、S、X不兼容:因爲上了表級X鎖後,會修改數據,所以即使是行級排他鎖,因爲表級鎖定的行肯定包括行級鎖定的行,所以表級X和IX、X都不兼容。

注意:上了行級X鎖後,行級X鎖不會因爲有別的事務上了IX而堵塞,一個mysql是允許多個行級X鎖同時存在的,只要他們不是針對相同的數據行。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章