OCC和MVCC的區別是什麼?

時間 2021-05-10 13:33:02

1樓:歡歌

1)如果採用OCC,可以在line 2和line 3 都不會去加鎖,只是記錄修改內容。在line 4 (commit)實際執行時,完成加鎖和解鎖。

2) 如果採用PCC,一般在line 2 和 line 3就加鎖,line 4完成只解鎖。相比之下,PCC持有鎖的時間長。

1begin

2update語句1

3update語句2

4commit

樂觀鎖的直觀理解:樂觀地認為不會這麼巧與別人衝突,不著急加鎖,認為一般都能成功commit。

2. MVCC的目的一般是避免為讀請求加鎖。這樣Read/Read, Read/Write併發時,讀請求不需要加鎖。

一般是使用快照/版本號之類的實現。如果讀取的是歷史資料,只要版本號不變,歷史資料不刪,無需加鎖,多次執行相同的讀,結果相同。注意,讀請求不需要加鎖,不代表完全不用檢查鎖和等鎖,這取決於具體的實現原理,比如高併發場景下,要讀的版本可能正在形成中。

2樓:陳廣勝

*最簡單的併發控制演算法是2PL(2 Phase Locking),分為兩階段:

1)獲得鎖階段;

2)釋放鎖階段。

一般2PL被稱為是悲觀併發控制。

與之相對的是樂觀併發控制OCC( Optimistic Concurrency Control)。OCC假設事務會成功,開始事務時該讀讀,該寫寫,不加鎖。只有到提交時做一下驗證,驗證這個事務是不是能夠成功提交。

OCC分為三階段:

1)Read Phase, 對於讀,放到Read Set,對於寫,把寫記到臨時副本,放到Write Set。因為寫是寫到臨時區的,屬於未提交結果,其它事務讀不到(這點是和MVCC的重要區別);

2)Validation Phase,重掃Read Set,Write Set,檢驗資料是否滿足Isolation Level,如果滿足則Commit,否則Abort;

3)WritePhase,或者叫做Commit Phase,把臨時副本區的資料更新到資料庫中,完成事務提交。

MVCC(Multiversion Concurrency Control)是另一種併發控制演算法。MVCC為每條記錄維護多個快照(Snapshot),通過起止兩個時間戳(Begin Timestamp / End Timestamp)維護副本的可見性。讀寫進行的不同操作如下:

Update,建立乙個新的版本(Version);

Delete,更新End Timestamp。

Read,通過起止時間戳判定記錄是否對當前事務可見(OCC讀不到未提交的記錄,所以不需要做這個判斷)。

這樣,通過Snapshot,實現了讀寫互不阻塞。但為了實現Serializable,對讀寫規則還是要進行一定的限制。MVCC通過不同的方法實現。

有基於鎖定的,MV-2PL,如MySQL。有基於時間排序(Time Ordering)的,叫MV-TO,如PostgreSQL。其實準確來說,PG的實現叫SSI(Serializable Snapshot Isolation),不算MV-TO。

也有像OCC那樣基於樂觀演算法的,MV-OCC,即讀寫時不做驗證,延遲到提交時驗證。

效率上,2PL讀寫阻塞,在維護鎖開銷較小時較好;OCC不維護鎖,一些比較新的OCC演算法吞吐可以做得很高,不過相應回滾也會比較高,衝突比較小和驗證開銷小時比較好;MVCC對不同型別的workload都有很好的適應性,讀寫互不阻塞,回滾率也比OCC好,很多RDBMS也都用MVCC,如Oracle,PostgreSQL,MySQL。還有乙個效率問題,隨著現在CPU核心數越來越多,考慮併發控制演算法往往需要考慮它的多核擴充套件性好不好。由於多數MVCC,OCC演算法都需要時間戳分配,時間戳通常對全域性變數進行CAS(Compare And Swap)操作來計算,當核心數變大時,CAS的爭用也變大了。

另外,現在的許多併發控制方法經常混合了多種演算法。先有人提出了A,後有人提出了B,再後來就有人提出了A+B,那麼A+B應該是叫A呢還是叫B呢?就像上面提到的MV-2PL,MV-TO,MV-OCC。

關於併發控制演算法怎麼分類,有不同的意見。

《Transactional Information Systems》對併發控制演算法的分類。把多版本相對於單版本,作為另乙個維度看。多版本可以應用在任一演算法上,形成MV-SGT,MV-TO,MV-2PL,MV-OCC等。

而CMU 15-722課程裡,把併發控制分為兩類,2PL和TO,OCC和MVCC都歸為TO。

感謝 @Ed Huang 糾正關於2PL應用場景的錯誤

和 的區別是什麼?

Hell 感覺就是我為我之前的行為感到抱歉 感情更誠懇真摯或者說莊重?就,和朋友鬧著玩的時候我錯了,或者不小心撞到別人時說的對不起。情景設計。和朋友打鬧撞到路人 你正對路人,90度行禮,向對方道歉。氣氛嚴肅你 可能回頭看了路人一眼,隨口禮貌性的道歉 對直到現在已經告一段的事情的表達歉意時,用 對當下...

和 的區別是什麼?

草牧子謙 今天恰好在看一些關於敬語的內容,順便來回答一下這一題。日語的敬語一般分為 尊敬語謙譲語丁寧語 三類。尊敬語是對句子主語的尊敬,謙讓語是說話人對自身行為的謙虛的說法,而丁寧語是對聽話人表示尊敬。這裡特別說明一下丁寧語。現代日語表示敬體的助動詞 就是丁寧語的一種。丁寧語的使用和主語是沒有關係的...

和 的區別是什麼?

柳老師31 1 是用在當說話人表達的意思是 給自己某物的時候。例如 世民 請給我點水。變為間接引語就是 世民說給他點水。動作的指向是指向說話人本身的,這種情況下是用 2 是用在當說話人表達的意思是 給除了說話人 聽話人之外的第三者某物時。例如 世民 請給玄英點水。變為間接引語就是 世民說請給玄英點水...