InnoDB 的意向鎖有什麼作用?

時間 2021-05-11 23:08:46

1樓:離開地球表面

表級別的鎖有兩種,一種S鎖,一種X鎖,當我們想給乙個表加S或X鎖時,需要進行兩個判斷:

1.表當前是否有其他級別鎖。

2.表中的行資料是否有行鎖。

1的情況很明顯,我們列舉一下2的情況。

a.表加S鎖時,行鎖是S鎖,不衝突

b.表加S鎖時,行鎖是X鎖,衝突

c.表加X鎖時,行鎖是X鎖,衝突

d.表加X鎖時,行鎖是X鎖,衝突

我們判斷能否加表鎖的問題,可以簡化成判斷2的情況,正常情況下,我們除了遍歷之外如何快速判斷2呢?MYSQL提供了一種辦法,意向鎖。當我們給行資料加S鎖時,先給表加IS鎖,當我們想給行加X鎖時,先給表加IX鎖。

2的情況可以變為

a.表加S鎖時,表有意向鎖IS鎖,不衝突

b.表加S鎖時,表有意向鎖IX鎖,衝突

c.表加X鎖時,表有意向鎖IS鎖,衝突

d.表加X鎖時,表有意向鎖IX鎖,衝突

IS和IX其實可以簡化為一種標識,表明行資料是否加鎖,如果的當成標識來看,那麼IS和IX也是相互相容的,即我每個事務都可以對錶加IS與IX鎖,IS與IX並不衝突

2樓:彤彤

事務1需要對錶A申請表鎖:

1、如果表A中已有乙個獨佔行鎖,不管事務1是申請獨佔表鎖還是共享表鎖,都是不能申請的。

2、如果事務1申請的是獨佔表鎖,表A中只有有行鎖(包括獨佔行鎖和共享行鎖),都不能申請的。

基於上面的規則在對錶A申請獨佔表鎖或共享表鎖時,都需要對A表當前是否存在的行鎖進行判斷,而這個判斷是需要以行的粒度去查詢,是比較耗時。為了優化這個,在進行行鎖前先設定表粒度的意向鎖,這樣在沒有併發獲取鎖時,只需要判斷表粒度的意向鎖,不需要以行的粒度去檢查併發鎖的情況。

意向鎖的設計目的:通過表粒度的意向鎖,在獲取表級別鎖並且不存在鎖併發時,不需要進行行粒度的鎖檢查。

3樓:CoreloneWu

意向鎖可以理解為是乙個flag,true表示該表中有記錄被鎖了,false表示表中記錄都很「乾淨」,沒有被鎖。

一、意向鎖的作用

加表鎖時提公升互斥判斷的效率,加速檢測表鎖與行鎖的衝突。

二、行鎖與表鎖互斥關係

要想理解意向鎖的作用,就有必要知道行鎖與表鎖的互斥關係。

經過測試(測試sql可以自行編寫,這就不貼了):

1.表級別讀鎖與表級別寫鎖是否互斥;是

2.行級別讀鎖與行級別寫鎖是否互斥; 是

3.表級別讀鎖與行級別讀鎖 ;否

4.表級別讀鎖與行級別寫鎖 ;是

5.表級別寫鎖與行級別讀鎖 ;否

6.表級別寫鎖與行級別寫鎖 ;是

總結:不論是表級鎖還是行級鎖,讀寫和寫寫互斥,讀讀不互斥;雖然表鎖和行鎖鎖定範圍不同,但是會相互衝突。

三、場景

1.當要更新一行記錄時就要用互斥行鎖鎖定該行記錄,但要進行如下判斷

(1)該錶是否有獨佔鎖,如果有則阻塞或直接失敗;反之走下面邏輯

(2)判斷該行是否有獨佔鎖,如果有阻塞,直到鎖釋放;

2.當要鎖表時(比如執行DDL語句,如alter table....等),不論是加表共享鎖還是表獨佔鎖,都需要執行以下判斷

(1)該錶是否有獨佔鎖,如果有則失敗,反之執行下面

(2)該表中是否有記錄持有獨佔鎖,如果有則失敗,反之阻塞;

判斷表中記錄是否有獨佔鎖首先想到的就是逐行遍歷,但如果表記錄很多,遍歷的效率很低;

所以MySQL 引入了意向鎖,來檢測表鎖和行鎖的衝突。

當事務要在記錄上加上讀鎖或寫鎖時,要首先在表上加上意向鎖。

這樣判斷表中是否有記錄加鎖就很簡單了,只要看下表上是否有意向鎖就行了。

意向鎖之間是不會產生衝突的,也不和 AUTO_INC 表鎖衝突,它只會阻塞表級讀鎖或表級寫鎖,另外,意向鎖也不會和行鎖衝突,行鎖只會和行鎖衝突。

4樓:

首先意向鎖是表級別的鎖,是InnoDB儲存引擎自己維護的,使用者無法手動新增意向鎖。

當我們要對某個page中的一行記錄進行鎖定時,需要對上層的table加意向鎖——IS/IX,意為該事務中有意向對錶中的某些行加X、S鎖。

主要是方便檢查表級別鎖和行級別鎖的衝突

5樓:lfeng

我認為, 對錶加鎖時, 不但要感知當前表的加鎖情況, 還要感知表中所有行的加鎖情況, 才能判定是否能加鎖成功, 但是對行加鎖情況感知需要遍歷每一行才行, 效率低. 所以引入意向鎖. 這樣, 新增行鎖時, 自動新增意向鎖, 新增表鎖時, 也僅需要感知當前表是否有鎖或意向鎖就ok了, 不需要再遍歷每一行去感知加鎖情況.

簡而言之就是為了提高加表鎖的效率.

6樓:田水月

先說結論:

1.提高了是否可以加鎖的判斷效率。

2.實現了行鎖和表鎖的多粒度鎖機制,使得表鎖和行鎖可以共存。

舉個栗子:

InnoDB儲存引擎從鎖的型別分為:行鎖(記錄鎖,間隙鎖和臨鍵鎖)和表鎖(意向鎖)。

當事務A對某行記錄加排它鎖(也就是修改記錄)時,對於開發者而言透明地對這個表加意向排它鎖。

事務B執行"select * from test where name='xiaokeai' for update"(name欄位為非索引字段)時,需要加表級排他鎖,而表級排他鎖與意向排他鎖衝突,所以會總阻塞事務B,從而提高了加鎖的判斷效率。具體的加鎖判斷圖如下:

加鎖關係圖

如果沒有意向排他鎖,事務B需要對錶一行行遍歷,判斷是否可以表級排他鎖,而意向鎖提高了加鎖判斷的效率。

同時使得表的行鎖和表鎖(意向鎖)共存,實現了多粒度的鎖層級。

7樓:wuxinliulei

http://duqingfeng.net/2018/06/23/由分布式鎖引發的總結(1)——MySQL%20InnoDB引擎中的鎖/

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

共享鎖(S Lock):允許事務讀一行資料

XX、XS、SX不相容:

T1事務獲取了r行的共享鎖,T2事務不能獲取排他鎖

T1事務獲取了r行的排他鎖,T2事務不能獲取共享鎖或者排他鎖

select語句預設不會加任何鎖型別,如果想加排他鎖可以使用select for update;想加共享鎖使用select lock in share mode

update、delete、insert都會自動給涉及到的資料加上排他鎖

需要注意的是,當給某一行增加共享鎖、排他鎖時,資料庫會自動給這一行所處的表新增意向共享鎖(IS Lock)、意向排他鎖(IX Lock)也就是說:如果想給r行增加鎖,需要給r行所在的表先增加意向排他鎖。

下面來看一下意向鎖的作用:

事務A鎖住了表中的一行,讓這一行只能讀(資料庫自動給該錶增加意向共享鎖),不能寫。之後,事務B申請整個表的寫鎖。

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

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

如果沒有意向鎖則是這樣的:

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

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

如果沒有意向鎖的話,則需要遍歷所有整個表判斷是否有行鎖的存在,以免發生衝突

如果有了意向鎖,只需要判斷該意向鎖與即將新增的表級鎖是否相容即可。因為意向鎖的存在代表了,有行級鎖的存在或者即將有行級鎖的存在。因而無需遍歷整個表,即可獲取結果

表鎖的語法是lock tables ...read / write,可以用unlock tables主動釋放鎖,也可以在客戶端斷開的時候自動釋放。需要注意,lock tables語法除了會限制別的執行緒的讀寫之外,也限定了本執行緒接下來的操作物件。

對於 insert、update、delete,InnoDB 會自動給涉及的資料加排他鎖(X),只有查詢 select 需要我們手動設定排他鎖

對於一般的 select 語句,InnoDB 不會加任何鎖,也就是可以多個併發去進行 select 的操作,不會有任何的鎖衝突,因為根本沒有鎖

如何設定共享鎖和排他鎖?

共享鎖:SELECT ... LOCK IN SHARE MODE;

排他鎖:SELECT ... FOR UPDATE;

共享鎖和排他鎖,系統在特定的條件下會自動新增共享鎖或者排他鎖,也可以手動新增共享鎖或者排他鎖。

意向共享鎖和意向排他鎖都是系統自動新增和自動釋放的,整個過程無需人工干預

共享鎖和排他鎖都是鎖的行記錄,意向共享鎖和意向排他鎖鎖定的是表

由於InnoDB儲存引擎支援的是行級別的鎖,因此意向鎖不會阻塞除全表掃瞄以外的任何請求。

參考了@大王叫我來巡山的答案

1.共享鎖(讀鎖)

加了讀鎖,只允許別的事務繼續加讀鎖而不能加寫鎖,也就是唯讀。

用法是SELECT … LOCK IN SHARE MODE

2.排他鎖(寫鎖)

加了寫鎖,別的事務不允許加任何鎖。

用法是SELECT…FOR UPDATE

3.意向鎖

意向鎖在 InnoDB 中是表級鎖,用來表達乙個事務想要獲取什麼。

意向鎖主要是針對整表的鎖

意向鎖間相互相容,對行級鎖不生效,

IX,IS是表級鎖,不會和行級的X,S鎖發生衝突。只會和表級的X,S發生衝突

先放意向鎖的相容圖,下面的X 和S 都是表級的排他鎖和共享鎖

意思是:

意向共享鎖與排他鎖衝突,也就是說如果A表中一行被加了排它鎖,那麼當有select * 這樣的全表掃瞄語句的時候將會加鎖失敗,因為全表掃瞄需要對錶加意向共享鎖,但是表上有排他行鎖,於是加鎖失敗;

意向排他鎖與排他鎖和共享鎖都衝突,同理也就是說如果A表中一行被加了排它鎖或者共享鎖,那麼當有需要加表級的意向排它鎖的時候,加鎖失敗;

1.不使用意向鎖

A使用排他行鎖鎖住了user表的id=5的這行資料,並未新增意向鎖。

B使用排它表鎖(比如上面說的lock tables ...write)鎖user表,會先去判斷每一行是否存在排他行鎖,效率非常的慢。

2.使用意向排他鎖(IX)

A使用排他行鎖鎖住了user表的id=5的這行資料,並對user表加了意向排他表鎖。

B使用排它/共享表鎖(比如上面說的lock tables ...read/write)去鎖user表,因為A表存在意向排他表鎖,則加鎖失敗。

即IX和X與S都衝突

3.使用意向共享鎖(IS)

若A使用共享鎖鎖住了user表的id=5的這行資料,並對user表加了意向共享表鎖。

若B使用共享表鎖(比如上面說的lock tables ...read)鎖user表,而共享鎖與意向共享鎖是相容的,所以B加鎖成功。

若B使用排他表鎖(比如上面說的lock tables ...write)鎖user表,而排他表鎖與意向共享表鎖是衝突的,所以B加鎖失敗。

即IS與X衝突,與S相容。

4.意向鎖與意向鎖相容

A申請user表的意向共享表鎖,並鎖住id=5這行資料

B申請user表的意向共享表鎖,並鎖住id=6這行資料

B申請user表的意向排他表鎖,並鎖住id=7這行資料

也就是因為意向鎖之間相互相容,所以意向鎖對行級鎖之間是不衝突的。

為什麼說innodb中的鎖是沒有開銷的,而ms sqlserver的鎖開銷會很大?

賴明星 1.lock 和 latch 首先,我們簡單理一下鎖的概念。在資料庫中,有兩種 鎖 分別是lock和latch。latch就是大家平時接觸的鎖 如mutex,rwlock,訊號量,spinlock等 lock是指資料庫中的鎖 如記錄鎖,表鎖和全域性鎖 2.lock在記憶體中的存在形式 對於記...

差速鎖是什麼?作用是幹嘛的?

征途 說人話就是越野的時候陷車了發現開不上來開啟差速鎖就能上來了.爬坡脫困的時候用到平時路面不需要用.氣鎖推薦ARB的氣鎖電鎖推薦CJ電控差速鎖都是鍛造的. 胖子 簡單幾句話。首先得是差速器,然後才能在此上建立鎖止機構。先有差速器,後有差速鎖,差速鎖一定先具備差速器的功能。順便說幾句。伊頓有好幾種鎖...

有什麼好的指紋鎖推薦

小錢錢chan 要是題主感興趣可以先看看我之前買鎖的經驗 小錢錢chan 分享下我買指紋鎖避開的那些坑 智慧型門鎖 指紋鎖2021年中品牌盤點 我可以說個比較簡單易用的方法來選擇指紋鎖的品牌最簡單的方法,直接從我的文章裡列舉的品牌裡面選擇。絕對都是產品質量 效能和售後服務都過關的智慧型門鎖!通過網路...