阿丹:
????????首先在談到并發(fā)控制機(jī)制的時(shí)候,我們通常會(huì)提及兩種重要的鎖策略。悲觀鎖(Pessimistic Locking)和樂(lè)觀鎖(Optimistic Locking)。這兩個(gè)是在處理并發(fā)的時(shí)候采取的不同思路。
悲觀鎖:
????????悲觀鎖: 悲觀鎖機(jī)制認(rèn)為并發(fā)操作中會(huì)有沖突,因此默認(rèn)情況下假設(shè)會(huì)出現(xiàn)并發(fā)沖突,因此采取阻止或延遲訪(fǎng)問(wèn)的方式來(lái)保證一致性和隔離性。悲觀鎖的基本思想是,在數(shù)據(jù)的訪(fǎng)問(wèn)和修改過(guò)程中,假設(shè)其他事務(wù)會(huì)對(duì)該數(shù)據(jù)進(jìn)行修改,因此在操作數(shù)據(jù)之前,先獲取鎖來(lái)保護(hù)資源的完整性。
當(dāng)一個(gè)事務(wù)試圖獲取悲觀鎖時(shí),它會(huì)將資源標(biāo)記為已鎖定狀態(tài),其他事務(wù)如果要訪(fǎng)問(wèn)該資源,必須等待鎖釋放。這種鎖定通常是獨(dú)占鎖,在鎖被持有期間,其他事務(wù)無(wú)法讀取或修改數(shù)據(jù),從而保證了數(shù)據(jù)的一致性和隔離性。悲觀鎖常用的實(shí)現(xiàn)方式是加鎖機(jī)制,如共享鎖(Shared Lock)和排他鎖(Exclusive Lock)。
阿丹解讀:
? ? ? ? 就是悲觀鎖認(rèn)為所有的資源都要使用我這個(gè),然后當(dāng)我在執(zhí)行一個(gè)事務(wù)的時(shí)候,我就給所有的東西鎖死了。一直到我解決完了當(dāng)前的事務(wù)別人才能從我這里訪(fǎng)問(wèn)資源。如果我在鎖上的時(shí)候啥我都不給。悲觀鎖說(shuō)我要保證一致性,所以就進(jìn)行了獨(dú)占鎖(排他鎖)。來(lái)解決沖突。
樂(lè)觀鎖
????????樂(lè)觀鎖: 樂(lè)觀鎖機(jī)制則采取了一種更加樂(lè)觀的假設(shè),它認(rèn)為并發(fā)操作中沖突的概率較低。樂(lè)觀鎖的基本思想是,在操作數(shù)據(jù)之前,不會(huì)加鎖,也不會(huì)阻止其他事務(wù)的并發(fā)訪(fǎng)問(wèn)。相反,事務(wù)在進(jìn)行修改前,會(huì)先獲取數(shù)據(jù)的一個(gè)快照或版本,并在操作完成時(shí)對(duì)數(shù)據(jù)進(jìn)行一致性驗(yàn)證。
????????在樂(lè)觀鎖中,每個(gè)事務(wù)通常會(huì)關(guān)聯(lián)一個(gè)版本號(hào)、時(shí)間戳或序列號(hào),這些信息用于識(shí)別數(shù)據(jù)的版本。在讀取和修改數(shù)據(jù)時(shí),事務(wù)會(huì)使用這些信息來(lái)驗(yàn)證數(shù)據(jù)是否被其他事務(wù)修改過(guò)。如果數(shù)據(jù)的版本與事務(wù)啟動(dòng)時(shí)的版本一致,則可以繼續(xù)操作;如果版本不一致,說(shuō)明在操作過(guò)程中數(shù)據(jù)已被修改,樂(lè)觀鎖機(jī)制會(huì)回滾事務(wù)或觸發(fā)相應(yīng)的沖突處理邏輯。
????????樂(lè)觀鎖常用的實(shí)現(xiàn)方式包括添加額外的字段來(lái)記錄版本信息,例如在數(shù)據(jù)庫(kù)中添加一個(gè)版本號(hào)字段或使用時(shí)間戳來(lái)標(biāo)記數(shù)據(jù)的更新時(shí)間。
????????悲觀鎖和樂(lè)觀鎖各有優(yōu)缺點(diǎn),適用于不同的場(chǎng)景。悲觀鎖機(jī)制保證了數(shù)據(jù)的強(qiáng)一致性和隔離性,但可能導(dǎo)致較高的鎖沖突和性能開(kāi)銷(xiāo)。樂(lè)觀鎖機(jī)制允許更高的并發(fā)性能,但需要應(yīng)用程序代碼對(duì)沖突進(jìn)行適當(dāng)處理,以保證數(shù)據(jù)的一致性。
阿丹解讀:
? ? ? ? 樂(lè)觀鎖其實(shí)就是在我去進(jìn)行數(shù)據(jù)庫(kù)落庫(kù)操作之前的之前,誰(shuí)來(lái)讀取我都給。因?yàn)槲以谖疫M(jìn)行邏輯操作計(jì)算的時(shí)候保存了一個(gè)類(lèi)似于快照的東西。樂(lè)觀鎖只需要在落庫(kù)之前對(duì)比一下我的數(shù)據(jù)和快照一樣不一樣,如果一樣就說(shuō)明我沒(méi)和別人沖突就正常落庫(kù)。如果不一樣就是在我進(jìn)行計(jì)算的時(shí)候有人和我沖突了。我就回滾。
? ? ? ? 所以樂(lè)觀鎖只鎖了寫(xiě)沒(méi)有鎖讀,所以對(duì)于其他的事務(wù)來(lái)說(shuō)更友好。樂(lè)觀鎖對(duì)操作加了鎖。
其他的并發(fā)控制機(jī)制
在數(shù)據(jù)庫(kù)系統(tǒng)中,常用的并發(fā)控制機(jī)制包括以下幾種:
-
鎖機(jī)制(Locking):鎖機(jī)制是最常見(jiàn)、最基本的并發(fā)控制機(jī)制之一。它通過(guò)使用鎖來(lái)保護(hù)共享資源,防止多個(gè)事務(wù)同時(shí)讀取或修改同一份數(shù)據(jù)。鎖可以分為共享鎖(Shared Lock)和排他鎖(Exclusive Lock),以允許讀取共享數(shù)據(jù)或獨(dú)占修改數(shù)據(jù)。
-
多版本并發(fā)控制(MVCC,Multi-Version Concurrency Control):MVCC通過(guò)對(duì)數(shù)據(jù)的版本管理來(lái)實(shí)現(xiàn)并發(fā)控制。它為每個(gè)事務(wù)創(chuàng)建數(shù)據(jù)的獨(dú)立版本,并通過(guò)版本號(hào)或時(shí)間戳來(lái)識(shí)別數(shù)據(jù)的不同版本,從而避免了讀-寫(xiě)沖突和寫(xiě)-寫(xiě)沖突。MVCC通常使用樂(lè)觀鎖來(lái)進(jìn)行并發(fā)控制。
-
串行化(Serializability):串行化是一種較為保守的并發(fā)控制機(jī)制,它確保事務(wù)以串行的方式執(zhí)行,從而避免了并發(fā)沖突。串行化通常使用鎖機(jī)制、時(shí)間戳或序列號(hào)等方式來(lái)實(shí)現(xiàn),但由于事務(wù)的串行執(zhí)行,可能會(huì)導(dǎo)致性能瓶頸。
-
快照隔離(Snapshot Isolation):快照隔離是一種基于版本管理的并發(fā)控制機(jī)制,它為每個(gè)事務(wù)提供一個(gè)快照(Snapshot)來(lái)讀取數(shù)據(jù)。每個(gè)事務(wù)在開(kāi)始時(shí)讀取數(shù)據(jù)的快照,并在事務(wù)提交時(shí)進(jìn)行驗(yàn)證??煺崭綦x提供了較高的并發(fā)性能和隔離性,但可能導(dǎo)致一些讀取操作的不一致性。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-686444.html
-
時(shí)間戳排序(Timestamp Ordering):時(shí)間戳排序是一種并發(fā)控制機(jī)制,它通過(guò)為每個(gè)事務(wù)分配全局唯一的時(shí)間戳來(lái)實(shí)現(xiàn)。事務(wù)按時(shí)間戳的先后順序執(zhí)行,從而避免了并發(fā)沖突。時(shí)間戳排序通常需要一個(gè)中心時(shí)鐘或全局時(shí)鐘來(lái)生成時(shí)間戳。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-686444.html
到了這里,關(guān)于Mysql--技術(shù)文檔--悲觀鎖、樂(lè)觀鎖-《控制并發(fā)機(jī)制簡(jiǎn)單認(rèn)知、深度理解》的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!