溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL關于鎖的類型和模式的討論

發(fā)布時間:2021-09-04 14:24:59 來源:億速云 閱讀:143 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“MYSQL關于鎖的類型和模式的討論”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一種數(shù)據(jù)庫中有很多種鎖,一般說起鎖都是在提,是表鎖,還是行鎖,有沒有死鎖。但實際上就算是MYSQL 的鎖的種類也不是那么簡單。

實際上討論一個鎖,需要從以下幾個方面來考慮

1  鎖的種類   表鎖  行鎖

2  加鎖的模式    

      LOCK_IS  
      LOCK_IX  
      LOCK_S  
      LOCK_X  
      LOCK_AUTO_INC

3  鎖的類型     

4  鎖的粒度

5  鎖所處的隔離級別

NEXT KEY LOCK   
LOCK_GAP   
LOCK_REC_NOT_GAP   

LOCK_INSERT_INTENTION 

在知道這些東西后,才能更好的理解鎖及其可能產(chǎn)生的各種死鎖或鎖超時的情況。

下面畫了一個圖,圖中是MYSQL 中提供的鎖的類型從圖中可以看到 IS意向鎖可以和除X鎖的其他鎖類型共存, X 鎖則是和任何鎖都是互斥的,和他本身也是一樣,AI 鎖 只和意向鎖共存。

MYSQL關于鎖的類型和模式的討論

AUTO_INC 鎖又叫自增鎖(一般簡寫成 AI 鎖),它是一種特殊類型的表鎖,當插入的表中有自增列(AUTO_INCREMENT)的時候可能會遇到。當插入表中有自增列時,數(shù)據(jù)庫需要自動生成自增值,在生成之前,它會先為該表加 AUTO_INC 表鎖,其他事務的插入操作阻塞,這樣保證生成的自增值肯定是唯一的。

  • AUTO_INC 鎖互不兼容,同一張表一個時刻只能有一個自增鎖

  • 自增鎖不遵循二段鎖協(xié)議,不是事務over時release,在 INSERT 語句執(zhí)行完成時釋放,用以提高并發(fā)插入的性能。

  • 自增值一旦分配了就會 +1,如果事務回滾,自增值也不會減回去,所以自增值可能會出現(xiàn)中斷的情況。

而我們熟悉的行鎖

LOCK_REC_NOT_GAP   ,record 鎖本身是沒有那么復雜的,他僅僅對他所在的記錄進行一個鎖,而相關的鎖,僅僅是鎖在索引上邊的,如果是primary key 則直接鎖在主鍵的位置,如果是二級索引,則除了鎖在二級索引上,同時還需要鎖在二級索引所指定的主鍵上。

NEXT KEY LOCK  next key lock,顧名思義  要不是  ( ]   [ )  ,(一個集合的概念),他主要的作用是防止幻讀,也就是兩次讀不一致的情況,所以LOCK_GAP 主要是要看所處的

隔離級別是R R  ,  RC  那兩種,MYSQL 默認的隔離級別是  RR ,但一般來說強烈建議 MYSQL 的通用的使用的隔離級別是  RC 。如果我們的隔離級別是RC 級別的情況下是不會有  next key lock 這樣的鎖。NEXT KEY LOCK 鎖會將鎖定記錄周圍的記錄也進行一個鎖定。

舉例:如果我們的數(shù)據(jù)表中 的數(shù)據(jù)記錄是   1   6  7 8 9  10 

select  * from t where number = 6 for update

此時鎖定的記錄

(1 6 7),此時如果在 1和 6之間插入數(shù)據(jù)會無法插入

GAP LOCK 間隙鎖,間隙鎖的知名度比 NEXT KEY LOCK 要大的的

(),標識間隙鎖,間隙鎖本來也可以理解成為范圍鎖,他將防止其他事務在這個范圍內(nèi)插入或修改記錄,保證兩次讀取這個范圍內(nèi)的記錄不會變,從而不會出現(xiàn)幻讀現(xiàn)象。添加間隙鎖和間隙鎖之間是不沖突的,而添加間隙鎖會嚴重影響數(shù)據(jù)庫的并發(fā)性,還以上面的例子來說,他是要鎖定 1(23456)7 ,同時不同的事務可以在間隙上持有沖突鎖。例如,事務A可以在一個gap上持有一個共享的gap鎖(gap S-lock),而事務B在同一個gap上持有一個獨占的gap鎖(gap X-lock)。允許存在沖突的間隙鎖的原因是,如果從索引中清除一條記錄,則必須合并不同事務在記錄中持有的間隙鎖。

LOCK_INSERT_INTENTION 插入意向鎖,主要是服務于插入服務的,在數(shù)據(jù)庫插入的時候會診斷插入數(shù)據(jù)的位置是否有間隙鎖,也就是和間隙鎖next key lock 這樣的鎖互斥。

記錄鎖和記錄鎖沖突,Next-key 鎖和 Next-key 鎖沖突,記錄鎖和 Next-key 鎖沖突;

舉例我們現(xiàn)在有下面一張表

MYSQL關于鎖的類型和模式的討論

我們模擬兩個SESSION 

1  select * from insert_lock where id <= 5 for update

2  insert into insert_lock (id,name,employee_number) values (4,'rty',12)

MYSQL關于鎖的類型和模式的討論

上邊的圖中可以清晰的看到  select 的查詢中包含了 GAP 鎖,所以GAP 鎖導致 插入失敗。

“MYSQL關于鎖的類型和模式的討論”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI