鎖
1.?對MySQL的鎖了解嗎
當(dāng)數(shù)據(jù)庫有并發(fā)事務(wù)的時候,可能會產(chǎn)生數(shù)據(jù)的不一致痪伦,這時候需要一些機制來保證訪問的次序侄榴,鎖機制就是這樣的一個機制。
就像酒店的房間网沾,如果大家隨意進出癞蚕,就會出現(xiàn)多人搶奪同一個房間的情況,而在房間上裝上鎖辉哥,申請到鑰匙的人才可以入住并且將房間鎖起來桦山,其他人只有等他使用完畢才可以再次使用攒射。
2. 隔離級別與鎖的關(guān)系
在Read Uncommitted級別下,讀取數(shù)據(jù)不需要加共享鎖恒水,這樣就不會跟被修改的數(shù)據(jù)上的排他鎖沖突
在Read Committed級別下会放,讀操作需要加共享鎖,但是在語句執(zhí)行完以后釋放共享鎖钉凌;
在Repeatable Read級別下鸦概,讀操作需要加共享鎖,但是在事務(wù)提交之前并不釋放共享鎖甩骏,也就是必須等待事務(wù)執(zhí)行完畢以后才釋放共享鎖。
SERIALIZABLE 是限制性最強的隔離級別先慷,因為該級別鎖定整個范圍的鍵饮笛,并一直持有鎖,直到事務(wù)完成论熙。
3. 按照鎖的粒度分?jǐn)?shù)據(jù)庫鎖有哪些福青?鎖機制與InnoDB鎖算法
在關(guān)系型數(shù)據(jù)庫中,可以按照鎖的粒度把數(shù)據(jù)庫鎖分為行級鎖(INNODB引擎)脓诡、表級鎖(MYISAM引擎)和頁級鎖(BDB引擎 )无午。
MyISAM和InnoDB存儲引擎使用的鎖:
MyISAM采用表級鎖(table-level locking)。
InnoDB支持行級鎖(row-level locking)和表級鎖祝谚,默認(rèn)為行級鎖
行級鎖宪迟,表級鎖和頁級鎖對比
行級鎖 行級鎖是Mysql中鎖定粒度最細(xì)的一種鎖,表示只針對當(dāng)前操作的行進行加鎖交惯。行級鎖能大大減少數(shù)據(jù)庫操作的沖突次泽。其加鎖粒度最小,但加鎖的開銷也最大席爽。行級鎖分為共享鎖 和 排他鎖意荤。
特點:開銷大,加鎖慢只锻;會出現(xiàn)死鎖玖像;鎖定粒度最小,發(fā)生鎖沖突的概率最低齐饮,并發(fā)度也最高捐寥。
表級鎖 表級鎖是MySQL中鎖定粒度最大的一種鎖,表示對當(dāng)前操作的整張表加鎖祖驱,它實現(xiàn)簡單上真,資源消耗較少,被大部分MySQL引擎支持羹膳。最常使用的MYISAM與INNODB都支持表級鎖定睡互。表級鎖定分為表共享讀鎖(共享鎖)與表獨占寫鎖(排他鎖)。
特點:開銷小,加鎖快就珠;不會出現(xiàn)死鎖寇壳;鎖定粒度大,發(fā)出鎖沖突的概率最高妻怎,并發(fā)度最低壳炎。
頁級鎖 頁級鎖是MySQL中鎖定粒度介于行級鎖和表級鎖中間的一種鎖。表級鎖速度快逼侦,但沖突多匿辩,行級沖突少,但速度慢榛丢。所以取了折衷的頁級铲球,一次鎖定相鄰的一組記錄。
特點:開銷和加鎖時間界于表鎖和行鎖之間晰赞;會出現(xiàn)死鎖稼病;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般
4. 從鎖的類別上分MySQL都有哪些鎖呢掖鱼?像上面那樣子進行鎖定豈不是有點阻礙并發(fā)效率了
從鎖的類別上來講然走,有共享鎖和排他鎖。
共享鎖: 又叫做讀鎖戏挡。當(dāng)用戶要進行數(shù)據(jù)的讀取時芍瑞,對數(shù)據(jù)加上共享鎖。共享鎖可以同時加上多個褐墅。
排他鎖: 又叫做寫鎖啄巧。當(dāng)用戶要進行數(shù)據(jù)的寫入時,對數(shù)據(jù)加上排他鎖掌栅。排他鎖只可以加一個秩仆,他和其他的排他鎖,共享鎖都相斥猾封。
用上面的例子來說就是用戶的行為有兩種澄耍,一種是來看房,多個用戶一起看房是可以接受的晌缘。一種是真正的入住一晚齐莲,在這期間,無論是想入住的還是想看房的都不可以磷箕。
鎖的粒度取決于具體的存儲引擎选酗,InnoDB實現(xiàn)了行級鎖,頁級鎖岳枷,表級鎖芒填。
他們的加鎖開銷從大到小呜叫,并發(fā)能力也是從大到小。
最后殿衰,小編分類整理了許多java進階學(xué)習(xí)材料和BAT面試給熱愛IT行業(yè)的你朱庆,如果需要資料的請轉(zhuǎn)發(fā)此文章后再私聊小編回復(fù)【java】就能領(lǐng)取2019年java進階學(xué)習(xí)資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也可以加群:712263501領(lǐng)取海量學(xué)習(xí)資料進行學(xué)習(xí)闷祥。