一递胧、MySQL鎖機(jī)制概述:
(一)什么是鎖,以及為什么使用鎖和鎖的運(yùn)作撬讽?
鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或純線程并發(fā)訪問某一資源的機(jī)制垮刹。在數(shù)據(jù)庫中野揪,除傳統(tǒng)的計(jì)算資源(CPU奕谭、RAM遗菠、I/O)的爭用以外,數(shù)據(jù)也是一種供許多用戶共享的資源烘豌。如何保證數(shù)據(jù)并發(fā)訪問的一致性载庭、有效性是所在有數(shù)據(jù)庫必須解決的一個(gè)問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個(gè)重要因素。從這個(gè)角度來說囚聚,鎖對數(shù)據(jù)庫而言顯得尤其重要靖榕,也更加復(fù)雜。
防止更新丟失顽铸,并不能單靠數(shù)據(jù)庫事務(wù)控制器來解決茁计,需要應(yīng)用程序?qū)σ碌臄?shù)據(jù)加必要的鎖來解決。
鎖的運(yùn)作谓松?
事務(wù)T在度某個(gè)數(shù)據(jù)對象(如表星压、記錄等)操作之前,先向系統(tǒng)發(fā)出請求鬼譬,對其加鎖娜膘,加鎖后事務(wù)T就對數(shù)據(jù)庫對象有一定的控制,在事務(wù)T釋放它的鎖之前拧簸,其他事務(wù)不能更新此數(shù)據(jù)對象劲绪。
(二)鎖定機(jī)制分類?
按封鎖類型分類:(數(shù)據(jù)對象可以是表可以是記錄)
1)排他鎖:(又稱寫鎖盆赤,X鎖)
一句總結(jié):會阻塞其他事務(wù)讀和寫。
若事務(wù)T對數(shù)據(jù)對象A加上X鎖歉眷,則只允許T讀取和修改A牺六,其他任何事務(wù)都不能再對加任何類型的鎖,知道T釋放A上的鎖汗捡。這就保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A淑际。
2)共享鎖:(又稱讀取,S鎖)
一句總結(jié):會阻塞其他事務(wù)修改表數(shù)據(jù)扇住。
若事務(wù)T對數(shù)據(jù)對象A加上S鎖春缕,則其他事務(wù)只能再對A加S鎖,而不能X鎖艘蹋,直到T釋放A上的鎖锄贼。這就保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改女阀。
(排它鎖)X鎖和(共享鎖)S鎖都是加載某一個(gè)數(shù)據(jù)對象上的宅荤。也就是數(shù)據(jù)的粒度。
按封鎖的數(shù)據(jù)粒度分類如下:
1)行級鎖定(row-level):
一句總結(jié):行級鎖:開銷大浸策,加鎖慢冯键;會出現(xiàn)死鎖;鎖定粒度最小庸汗,發(fā)生鎖沖突的概率最低惫确,并發(fā)度也最高。
詳細(xì):行級鎖定最大的特點(diǎn)就是鎖定對象的顆粒度很小,也是目前各大數(shù)據(jù)庫管理軟件所實(shí)現(xiàn)的鎖定顆粒度最小的改化。由于鎖定顆粒度很小昧诱,所以發(fā)生鎖定資源爭用的概率也最小,能夠給予應(yīng)用程序盡可能大的并發(fā)處理能力而提高一些需要高并發(fā)應(yīng)用系統(tǒng)的整體性能所袁。
缺陷:由于鎖定資源的顆粒度很小盏档,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了燥爷。此外蜈亩,行級鎖定也最容易發(fā)生死鎖。
2)表級鎖定(table-level):
一句總結(jié):表級鎖:開銷小前翎,加鎖快稚配;不會出現(xiàn)死鎖;鎖定粒度大港华,發(fā)生鎖沖突的概率最高道川,并發(fā)度最低。
詳細(xì):和行級鎖定相反立宜,表級別的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機(jī)制冒萄。該鎖定機(jī)制最大的特點(diǎn)是實(shí)現(xiàn)邏輯非常簡單,帶來的系統(tǒng)負(fù)面影響最小橙数。所以獲取鎖和釋放鎖的速度很快尊流。由于表級鎖一次會將整個(gè)表鎖定,所以可以很好的避免困擾我們的死鎖問題灯帮。
缺陷:鎖定顆粒度大所帶來最大的負(fù)面影響就是出現(xiàn)鎖定資源爭用的概率也會最高崖技,致使并發(fā)度大打折扣。
3)頁級鎖定(page-level):(MySQL特有)
一句總結(jié):頁級鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間钟哥;會出現(xiàn)死鎖迎献;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般腻贰。
詳細(xì):頁級鎖定是MySQL中比較獨(dú)特的一種鎖定級別吁恍,在其他數(shù)據(jù)庫管理軟件中也并不是太常見。頁級鎖定的特點(diǎn)是鎖定顆粒度介于行級鎖定與表級鎖之間银受,所以獲取鎖定所需要的資源開銷践盼,以及所能提供的并發(fā)處理能力也同樣是介于上面二者之間。
缺陷:頁級鎖定和行級鎖定一樣宾巍,會發(fā)生死鎖咕幻。
(三)數(shù)據(jù)庫事務(wù)機(jī)制(這個(gè)是數(shù)據(jù)庫核心)
(為什么提及事務(wù)?因?yàn)槭聞?wù)中有封鎖機(jī)制)
1)什么叫事務(wù)顶霞?簡稱ACID肄程。是恢復(fù)和并發(fā)控制的基本單位锣吼。
A 事務(wù)的原子性(Atomicity):指一個(gè)事務(wù)要么全部執(zhí)行,要么不執(zhí)行.也就是說一個(gè)事務(wù)不可能只執(zhí)行了一半就停止了.比如你從取款機(jī)取錢,這個(gè)事務(wù)可以分成兩個(gè)步驟:1劃卡,2出錢.不可能劃了卡,而錢卻沒出來.這兩步必須同時(shí)完成.要么就不完成.
C 事務(wù)的一致性(Consistency):指事務(wù)的運(yùn)行并不改變數(shù)據(jù)庫中數(shù)據(jù)的一致性.例如,完整性約束了a+b=10,一個(gè)事務(wù)改變了a,那么b也應(yīng)該隨之改變.
I 獨(dú)立性(Isolation):事務(wù)的獨(dú)立性也有稱作隔離性,是指兩個(gè)以上的事務(wù)不會出現(xiàn)交錯(cuò)執(zhí)行的狀態(tài).因?yàn)檫@樣可能會導(dǎo)致數(shù)據(jù)不一致.
D 持久性(Durability):事務(wù)的持久性是指事務(wù)執(zhí)行成功以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便是持久的保存在數(shù)據(jù)庫之中,不會無緣無故的回滾.
4)事務(wù)隔離級別:
這個(gè)是mysql用意向鎖來解決事務(wù)并發(fā)問題蓝厌,為了區(qū)別封鎖協(xié)議玄叠,弄了一個(gè)新概念隔離性級別:包括Read Uncommitted、Read Committed拓提、Repeatable Read读恃、Serializable。mysql 一般默認(rèn)Repeatable Read代态。
1.讀未提交(Read Uncommited寺惫,RU)
一句總結(jié):讀取數(shù)據(jù)一致性在最低級別,只能保證不讀物理上損壞的數(shù)據(jù)蹦疑,會臟讀西雀,會不可重復(fù)讀,會幻讀歉摧。
這種隔離級別下艇肴,事務(wù)間完全不隔離,會產(chǎn)生臟讀叁温,可以讀取未提交的記錄再悼,實(shí)際情況下不會使用。
2.讀提交(Read commited券盅,RC)
一句總結(jié):讀取數(shù)據(jù)一致性在語句級別帮哈,不會臟讀,會不可重復(fù)讀锰镀,會幻讀。
僅能讀取到已提交的記錄咖刃,這種隔離級別下泳炉,會存在幻讀現(xiàn)象,所謂幻讀是指在同一個(gè)事務(wù)中嚎杨,多次執(zhí)行同一個(gè)查詢花鹅,返回的記錄不完全相同的現(xiàn)象》阏悖幻讀產(chǎn)生的根本原因是刨肃,在RC隔離級別下,每條語句都會讀取已提交事務(wù)的更新箩帚,若兩次查詢之間有其他事務(wù)提交真友,則會導(dǎo)致兩次查詢結(jié)果不一致。雖然如此紧帕,讀提交隔離級別在生產(chǎn)環(huán)境中使用很廣泛盔然。
3.可重復(fù)讀(Repeatable Read, RR)
一句總結(jié):讀取數(shù)據(jù)一致性在事務(wù)級別桅打,不會臟讀,不會不可重復(fù)讀愈案,會幻讀挺尾。
可重復(fù)讀隔離級別解決了不可重復(fù)讀的問題,但依然沒有解決幻讀的問題站绪。不可重復(fù)讀重點(diǎn)在修改遭铺,即讀取過的數(shù)據(jù),兩次讀的值不一樣恢准;而幻讀則側(cè)重于記錄數(shù)目變化【插入和刪除】魂挂。
4.串行化(Serializable)
一句總結(jié):讀取數(shù)據(jù)一致性在最高級別,事務(wù)級別顷歌,不會臟讀锰蓬,不會不可重復(fù)讀,不會幻讀眯漩。
在串行化隔離模式下芹扭,消除了臟讀,幻象赦抖,但事務(wù)并發(fā)度急劇下降舱卡,事務(wù)的隔離級別與事務(wù)的并發(fā)度成反比,隔離級別越高队萤,事務(wù)的并發(fā)度越低轮锥。實(shí)際生產(chǎn)環(huán)境下,dba會在并發(fā)和滿足業(yè)務(wù)需求之間作權(quán)衡要尔,選擇合適的隔離級別舍杜。
這樣就解釋了為什么僅靠事務(wù)就能解決丟失修改是錯(cuò)誤的了。