mysql悲观锁只用于读取吗_MySQL中悲观锁和乐观锁到底是什么?
索引和鎖是數(shù)據(jù)庫中的兩個(gè)核心知識(shí)點(diǎn),隔離級別的實(shí)現(xiàn)都是通過鎖來完成的
按照鎖顆粒對鎖進(jìn)行劃分??
鎖用來對數(shù)據(jù)進(jìn)行鎖定,我們可以從鎖定對象的粒度大小來對鎖進(jìn)行劃分,分別為行鎖、頁鎖和表鎖。行鎖就是按照行的粒度對數(shù)據(jù)進(jìn)行鎖定。鎖定力度小,發(fā)生鎖沖突概率低,可以實(shí)現(xiàn)的并發(fā)度高,但是對于鎖的開銷比較大,加鎖會(huì)比較慢,容易出現(xiàn)死鎖情況。
頁鎖就是在頁的粒度上進(jìn)行鎖定,鎖定的數(shù)據(jù)資源比行鎖要多,因?yàn)橐粋€(gè)頁中可以有多個(gè)行記錄。當(dāng)我們使用頁鎖的時(shí)候,會(huì)出現(xiàn)數(shù)據(jù)浪費(fèi)的現(xiàn)象,但這樣的浪費(fèi)最多也就是一個(gè)頁上的數(shù)據(jù)行。頁鎖的開銷介于表鎖和行鎖之間,會(huì)出現(xiàn)死鎖。鎖定粒度介于表鎖和行鎖之間,并發(fā)度一般。
表鎖就是對數(shù)據(jù)表進(jìn)行鎖定,鎖定粒度很大,同時(shí)發(fā)生鎖沖突的概率也會(huì)較高,數(shù)據(jù)訪問的并發(fā)度低。不過好處在于對鎖的使用開銷小,加鎖會(huì)很快。
還有區(qū)鎖和數(shù)據(jù)庫鎖.
每個(gè)層級的鎖數(shù)量是有限制的,因?yàn)殒i會(huì)占用內(nèi)存空間,鎖空間的大小是有限的。當(dāng)某個(gè)層級的鎖數(shù)量超過了這個(gè)層級的閾值時(shí),就會(huì)進(jìn)行鎖升級。鎖升級就是用更大粒度的鎖替代多個(gè)更小粒度的鎖,比如 InnoDB 中行鎖升級為表鎖,這樣做的好處是占用的鎖空間降低了,但同時(shí)數(shù)據(jù)的并發(fā)度也下降了。
從數(shù)據(jù)庫管理的角度對鎖進(jìn)行劃分
共享鎖和排它鎖共享鎖也叫讀鎖或 S 鎖,共享鎖鎖定的資源可以被其他用戶讀取,但不能修改。在進(jìn)行SELECT的時(shí)候,會(huì)將對象進(jìn)行共享鎖鎖定,當(dāng)數(shù)據(jù)讀取完畢之后,就會(huì)釋放共享鎖,這樣就可以保證數(shù)據(jù)在讀取時(shí)不被修改。
排它鎖也叫獨(dú)占鎖、寫鎖或 X 鎖。排它鎖鎖定的數(shù)據(jù)只允許進(jìn)行鎖定操作的事務(wù)使用,其他事務(wù)無法對已鎖定的數(shù)據(jù)進(jìn)行查詢或修改。
當(dāng)我們對數(shù)據(jù)進(jìn)行更新的時(shí)候,也就是INSERT、DELETE或者UPDATE的時(shí)候,數(shù)據(jù)庫也會(huì)自動(dòng)使用排它鎖,防止其他事務(wù)對該數(shù)據(jù)行進(jìn)行操作。
意向鎖(Intent Lock),簡單來說就是給更大一級別的空間示意里面是否已經(jīng)上過鎖。
從程序員的角度對鎖進(jìn)行劃分
樂觀鎖
樂觀鎖(Optimistic Locking)認(rèn)為對同一數(shù)據(jù)的并發(fā)操作不會(huì)總發(fā)生,屬于小概率事件,不用每次都對數(shù)據(jù)上鎖,也就是不采用數(shù)據(jù)庫自身的鎖機(jī)制,而是通過程序來實(shí)現(xiàn)。在程序上,我們可以采用版本號(hào)機(jī)制或者時(shí)間戳機(jī)制實(shí)現(xiàn)。樂觀鎖的版本號(hào)機(jī)制
在表中設(shè)計(jì)一個(gè)版本字段 version,第一次讀的時(shí)候,會(huì)獲取 version 字段的取值。然后對數(shù)據(jù)進(jìn)行更新或刪除操作時(shí),會(huì)執(zhí)行UPDATE ... SET version=version+1 WHERE version=version。此時(shí)如果已經(jīng)有事務(wù)對這條數(shù)據(jù)進(jìn)行了更改,修改就不會(huì)成功。樂觀鎖的時(shí)間戳機(jī)制
時(shí)間戳和版本號(hào)機(jī)制一樣,也是在更新提交的時(shí)候,將當(dāng)前數(shù)據(jù)的時(shí)間戳和更新之前取得的時(shí)間戳進(jìn)行比較,如果兩者一致則更新成功,否則就是版本沖突。
悲觀鎖
悲觀鎖(Pessimistic Locking)也是一種思想,對數(shù)據(jù)被其他事務(wù)的修改持保守態(tài)度,會(huì)通過數(shù)據(jù)庫自身的鎖機(jī)制來實(shí)現(xiàn),從而保證數(shù)據(jù)操作的排它性。
適用場景樂觀鎖適合讀操作多的場景,相對來說寫的操作比較少。它的優(yōu)點(diǎn)在于程序?qū)崿F(xiàn),不存在死鎖問題,不過適用場景也會(huì)相對樂觀,因?yàn)樗柚共涣顺顺绦蛞酝獾臄?shù)據(jù)庫操作。
悲觀鎖適合寫操作多的場景,因?yàn)閷懙牟僮骶哂信潘浴2捎帽^鎖的方式,可以在數(shù)據(jù)庫層面阻止其他事務(wù)對該數(shù)據(jù)的操作權(quán)限,防止讀 - 寫和寫 - 寫的沖突。
總結(jié)
樂觀鎖和悲觀鎖并不是鎖,而是鎖的設(shè)計(jì)思想。
避免死鎖的發(fā)生:如果事務(wù)涉及多個(gè)表,操作比較復(fù)雜,那么可以盡量一次鎖定所有的資源,而不是逐步來獲取,這樣可以減少死鎖發(fā)生的概率;
如果事務(wù)需要更新數(shù)據(jù)表中的大部分?jǐn)?shù)據(jù),數(shù)據(jù)表又比較大,這時(shí)可以采用鎖升級的方式,比如將行級鎖升級為表級鎖,從而減少死鎖產(chǎn)生的概率;
不同事務(wù)并發(fā)讀寫多張數(shù)據(jù)表,可以約定訪問表的順序,采用相同的順序降低死鎖發(fā)生的概率
總結(jié)
以上是生活随笔為你收集整理的mysql悲观锁只用于读取吗_MySQL中悲观锁和乐观锁到底是什么?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模拟撞击_正确看待小行星威胁!NASA模
- 下一篇: mysql table combine_