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年中品牌盤點 我可以說個比較簡單易用的方法來選擇指紋鎖的品牌最簡單的方法,直接從我的文章裡列舉的品牌裡面選擇。絕對都是產品質量 效能和售後服務都過關的智慧型門鎖!通過網路...