Mysql悲觀鎖樂觀鎖區(qū)別與使用場景

俗話說金三銀四,不管是為了升職加薪還是打算換個環(huán)境,現(xiàn)在正是廣大程序員們的跳槽季,IT行業(yè)正暗流涌動腥風血雨,互聯(lián)網(wǎng)寒冬似乎并沒有過去,很多企業(yè)依然在裁員,還有部分企業(yè)光明正大的實行著"996",這一行可能正面臨著最大的競爭壓力和生存壓力。我們無法改變環(huán)境,也無法左右市場,但是我們能改變和左右的是自己的知識深度和廣度,只有武裝到牙齒,不斷的充實自己,才能在面試這場江湖紛爭里游刃有余。

你是不是經(jīng)常被面試官突如其來的問題問的語無倫次或者毫無底氣?進而在一整場面試里都失去了信心。最近有個群員就遇到這個問你,面試官讓他自我介紹以后,就突然問他mysql的悲觀鎖和樂觀鎖區(qū)別,而這正好是他的盲區(qū),第一個問題就被堵住了,這場面試的結果也可想而知。下面就從面試角度來淺談一下,該怎樣回答這個問題。

一、概念上區(qū)別

樂觀鎖(** Optimistic Locking**):顧名思義,對加鎖持有一種樂觀的態(tài)度,即先進行業(yè)務操作,不到最后一步不進行加鎖,"樂觀"的認為加鎖一定會成功的,在最后一步更新數(shù)據(jù)的時候再進行加鎖。

悲觀鎖(Pessimistic Lock):正如其名字一樣,悲觀鎖對數(shù)據(jù)加鎖持有一種悲觀的態(tài)度。因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機制(也只有數(shù)據(jù)庫層提供的鎖機制才能真正保證數(shù)據(jù)訪問的排他性,否則,即使在本系統(tǒng)中實現(xiàn)了加鎖機制,也無法保證外部系統(tǒng)不會修改數(shù)據(jù))。

二、實現(xiàn)方式:

樂觀鎖:

  • version方式:一般是在數(shù)據(jù)表中加上一個數(shù)據(jù)版本號version字段,表示數(shù)據(jù)被修改的次數(shù),當數(shù)據(jù)被修改時,version值會加一。當線程A要更新數(shù)據(jù)值時,在讀取數(shù)據(jù)的同時也會讀取version值,在提交更新時,若剛才讀取到的version值為當前數(shù)據(jù)庫中的version值相等時才更新,否則重試更新操作,直到更新成功。
    sql實現(xiàn)代碼:

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};

  • CAS(定義見后)操作方式:即compare and swap 或者 compare and set,涉及到三個操作數(shù),數(shù)據(jù)所在的內(nèi)存值,預期值,新值。當需要更新時,判斷當前內(nèi)存值與之前取到的值是否相等,若相等,則用新值更新,若失敗則重試,一般情況下是一個自旋操作,即不斷的重試。(這種方式作者也是最近剛知道,慚愧慚愧)

悲觀鎖:是由數(shù)據(jù)庫自己實現(xiàn)了的,要用的時候,我們直接調(diào)用數(shù)據(jù)庫的相關語句就可以了(原理:共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉(zhuǎn)讓給其它線程),如行鎖、讀鎖和寫鎖等,都是在操作之前加鎖,在Java中,synchronized的思想也是悲觀鎖。

三、使用場景

  • 樂觀鎖:比較適合讀取操作比較頻繁的場景,如果出現(xiàn)大量的寫入操作,數(shù)據(jù)發(fā)生沖突的可能性就會增大,為了保證數(shù)據(jù)的一致性,應用層需要不斷的重新獲取數(shù)據(jù),這樣會增加大量的查詢操作,降低了系統(tǒng)的吞吐量。

  • 悲觀鎖:比較適合寫入操作比較頻繁的場景,如果出現(xiàn)大量的讀取操作,每次讀取的時候都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統(tǒng)的吞吐量。

四、特點

  • 樂觀鎖:樂觀鎖的特點先進行業(yè)務操作,不到萬不得已不去拿鎖。即“樂觀”的認為拿鎖多半是會成功的,因此在進行完業(yè)務操作需要實際更新數(shù)據(jù)的最后一步再去拿一下鎖就好。

  • 悲觀鎖:悲觀鎖的特點是先獲取鎖,再進行業(yè)務操作,即“悲觀”的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業(yè)務操作。通常所說的“一鎖二查三更新”即指的是使用悲觀鎖。

五、sql實現(xiàn)代碼和案例

因為本文主要是講解的是面試的時候怎樣回答,所以就不將具體sql代碼和案例貼出來了,感興趣的同學可以自行去看一下,如果以后有時間,我也會單獨寫一篇詳細的實現(xiàn)案例出來。

下面是一張網(wǎng)絡圖,作者覺得畫的蠻好的,給大家參考一下

image

總結:

以上,基本回答完前四點后,這道題已經(jīng)能在面試官心里達到八九十分了。但是我們的人生不僅僅是為了面試,希望同學們一定要弄懂其中的原理和區(qū)別,悲觀鎖和樂觀鎖都有自己的優(yōu)缺點,簡而言之記得一句話:讀取頻繁使用樂觀鎖,寫入頻繁使用悲觀鎖。樂觀鎖不能解決臟讀的問題。

如果覺得本文有用,請推薦給更多有需要的人,謝謝!如果發(fā)現(xiàn)問題,歡迎留言,請隨時批評改正,謝謝!

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容