您好,登錄后才能下訂單哦!
本篇內(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 鎖 只和意向鎖共存。
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 則直接鎖在主鍵的位置,如果是二級索引,則除了鎖在二級索引上,同時還需要鎖在二級索引所指定的主鍵上。
隔離級別是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)在有下面一張表
我們模擬兩個SESSION
1 select * from insert_lock where id <= 5 for update
2 insert into insert_lock (id,name,employee_number) values (4,'rty',12)
上邊的圖中可以清晰的看到 select 的查詢中包含了 GAP 鎖,所以GAP 鎖導致 插入失敗。
“MYSQL關于鎖的類型和模式的討論”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注億速云網(wǎng)站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。