MySQL 里面表級別的鎖有這幾種:
表鎖;
元數(shù)據(jù)鎖(MDL);
意向鎖;
AUTO-INC 鎖
MySQL數(shù)據(jù)庫里面的鎖是基于索引實現(xiàn)的,在Innodb中鎖都是作用在索引上面的,當(dāng)SQL命中索引時,那么鎖住的就是命中條件內(nèi)的索引節(jié)點(行鎖),如果沒有命中索引的話,那我們鎖的就是整個索引樹(表鎖)。
?
按屬性分:
共享鎖(share lock):共享鎖又稱讀鎖,簡稱S鎖;當(dāng)一個事務(wù)為數(shù)據(jù)加上讀鎖之后,其他事務(wù)只能對該數(shù)據(jù)加讀鎖,而不能對數(shù)據(jù)加寫鎖,直到所有的讀鎖釋放之后其他事務(wù)才能對其進(jìn)行加持寫鎖。共享鎖的特性主要是為了支持并發(fā)的讀取數(shù)據(jù),讀取數(shù)據(jù)的時候不支持修改,避免出現(xiàn)重復(fù)讀的問題。
排他鎖(exclusive lock)︰排他鎖又稱寫鎖,簡稱×鎖;當(dāng)一個事務(wù)為數(shù)據(jù)加上寫鎖時,其他請求將不能再為數(shù)據(jù)加任何鎖,直到該鎖釋放之后,其他事務(wù)才能對數(shù)據(jù)進(jìn)行加鎖。排他鎖的目的是在數(shù)據(jù)修改時候,不允許其他人同時修改,也不允許其他人讀取,避免了出現(xiàn)臟數(shù)據(jù)和臟讀的問題。
按粒度分:
行鎖:行鎖是指上鎖的時候鎖住的是表的某一行或多行記錄,其他事務(wù)訪問同一張表時,只有被鎖住的記錄不能訪問,其他的記錄可正常訪問,特點:粒度小,加鎖比表鎖麻煩,不容易沖突,相比表鎖支持的并發(fā)要高
表鎖(table lock):表鎖是指上鎖的時候鎖住的是整個表,當(dāng)下一個事務(wù)訪問該表的時候,必須等前一個事務(wù)釋放了鎖才能進(jìn)行對表進(jìn)行訪問;特點:粒度大,加鎖簡單,容易沖突;
頁鎖:頁級鎖是MysQL中鎖定粒度介于行級鎖和表級鎖中間的一種鎖.表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。特點:開銷和加鎖時間界于表鎖和行鎖之間,會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。
記錄鎖(Record lock):記錄鎖也屬于行鎖中的一種,只不過記錄鎖的范圍只是表中的某一條記錄,記錄鎖是說事務(wù)在加鎖后鎖住的只是表的某一條記錄,加了記錄鎖之后數(shù)據(jù)可以避免數(shù)據(jù)在查詢的時候被修改的重復(fù)讀問題,也避免了在修改的事務(wù)未提交前被其他事務(wù)讀取的臟讀問題
間隙鎖:是屬于行鎖的一種,間隙鎖是在事務(wù)加鎖后其鎖住的是表記錄的某一個區(qū)間,當(dāng)表的相鄰ID之間出現(xiàn)空隙則會形成一個區(qū)間,遵循左開右閉原則。范圍查詢并且查詢未命中記錄,查詢條件必須命中索引、間隙鎖只會出現(xiàn)在REPEATABLE_READ(重復(fù)讀)的事務(wù)級別中。
臨鍵鎖(Next-Key lock):也屬于行鎖的一種,并且它是INNODB的行鎖默認(rèn)算法,總結(jié)來說它就是記錄鎖和間隙鎖的組合,臨鍵鎖會把查詢出來的記錄鎖住,同時也會把該范圍查詢內(nèi)的所有間隙空間也會鎖住
WRITE-BUG研發(fā)團(tuán)隊衷心希望【W(wǎng)RITE-BUG數(shù)字空間】可以給每位同學(xué)一個屬于自己的秘密空間,同時祝愿大家在“公開圈子”世界里,遇見志同道合的伙伴們,因為我們與大家一樣,都曾孤獨前行著。



標(biāo)簽: