91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Java悲觀鎖與樂觀鎖

發布時間:2021-11-18 18:07:09 來源:億速云 閱讀:169 作者:iii 欄目:移動開發

本篇內容介紹了“怎么理解Java悲觀鎖與樂觀鎖”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1

鎖(Lock)

在介紹悲觀鎖和樂觀鎖之前,讓我們看一下什么是鎖。

鎖,在我們生活中隨處可見,我們的門上有鎖,我們存錢的保險柜上有鎖,是用來保護我們財產安全的。

程序中也有鎖,當多個線程修改共享變量時,我們可以給修改操作上鎖(syncronized)。

當多個用戶修改表中同一數據時,我們可以給該行數據上鎖(行鎖)。因此,鎖其實是在并發下控制多個操作的順序執行,以此來保證數據安全的變動。

并且,鎖是一種保證數據安全的機制和手段,而并不是特定于某項技術的。悲觀鎖和樂觀鎖亦是如此。本篇介紹的悲觀鎖和樂觀鎖是基于數據庫層面的。

怎么理解Java悲觀鎖與樂觀鎖

2

悲觀鎖

悲觀鎖(Pessimistic Concurrency Control),第一眼看到它,相信每個人都會想到這是一個悲觀的鎖。沒錯,它就是一個悲觀的鎖。

那這個悲觀體現在什么地方呢?悲觀是我們人類一種消極的情緒,對應到鎖的悲觀情緒,悲觀鎖認為被它保護的數據是極其不安全的,每時每刻都有可能變動,一個事務拿到悲觀鎖后(可以理解為一個用戶),其他任何事務都不能對該數據進行修改,只能等待鎖被釋放才可以執行。

數據庫中的行鎖,表鎖,讀鎖,寫鎖,以及syncronized實現的鎖均為悲觀鎖。

怎么理解Java悲觀鎖與樂觀鎖

這里再介紹一下什么是數據庫的表鎖和行鎖,以免有的同學對后面悲觀鎖的實現看不明白。

我們經常使用的數據庫是mysql,mysql中最常用的引擎是Innodb,Innodb默認使用的是行鎖。而行鎖是基于索引的,因此要想加上行鎖,在加鎖時必須命中索引,否則將使用表鎖。

怎么理解Java悲觀鎖與樂觀鎖

3

樂觀鎖

與悲觀相對應,樂觀是我們人類一種積極的情緒。樂觀鎖(Optimistic Concurrency Control)的“樂觀情緒”體現在,它認為數據的變動不會太頻繁。因此,它允許多個事務同時對數據進行變動。

但是,樂觀不代表不負責,那么怎么去負責多個事務順序對數據進行修改呢?

樂觀鎖通常是通過在表中增加一個版本(version)或時間戳(timestamp)來實現,其中,版本最為常用。

事務在從數據庫中取數據時,會將該數據的版本也取出來(v1),當事務對數據變動完畢想要將其更新到表中時,會將之前取出的版本v1與數據中最新的版本v2相對比,如果v1=v2,那么說明在數據變動期間,沒有其他事務對數據進行修改,此時,就允許事務對表中的數據進行修改,并且修改時version會加1,以此來表明數據已被變動。

如果,v1不等于v2,那么說明數據變動期間,數據被其他事務改動了,此時不允許數據更新到表中,一般的處理辦法是通知用戶讓其重新操作。不同于悲觀鎖,樂觀鎖是人為控制的。

怎么理解Java悲觀鎖與樂觀鎖

4

如何實現

經過上面的學習,我們知道悲觀鎖和樂觀鎖是用來控制并發下數據的順序變動問題的。那么我們就模擬一個需要加鎖的場景,來看不加鎖會出什么問題,并且怎么利用悲觀鎖和樂觀鎖去解決。

場景:A和B用戶最近都想吃豬肉脯,于是他們打開了購物網站,并且找到了同一家賣豬肉脯的>店鋪。下面是這個店鋪的商品表goods結構和表中的數據。

怎么理解Java悲觀鎖與樂觀鎖

從表中可以看到豬肉脯目前的數量只有1個了。在不加鎖的情況下,如果A,B同時下單,就有可能導致超賣。

悲觀鎖解決

利用悲觀鎖的解決思路是,我們認為數據修改產生沖突的概率比較大,所以在更新之前,我們顯示的對要修改的記錄進行加鎖,直到自己修改完再釋放鎖。加鎖期間只有自己可以進行讀寫,其他事務只能讀不能寫。

A下單前先給豬肉脯這行數據(id=1)加上悲觀鎖(行鎖)。此時這行數據只能A來操作,也就是只有A能買。B想買就必須一直等待。

當A買好后,B再想去買的時候會發現數量已經為0,那么B看到后就會放棄購買。

那么如何給豬肉脯也就是id=1這條數據加上悲觀鎖鎖呢?我們可以通過以下語句給id=1的這行數據加上悲觀鎖

  select num from goods where id = 1 for update;

“怎么理解Java悲觀鎖與樂觀鎖”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

灵山县| 三原县| 唐山市| 抚州市| 老河口市| 二连浩特市| 抚宁县| 甘孜县| 烟台市| 清水县| 瓦房店市| 呼图壁县| 七台河市| 长武县| 灵武市| 彩票| 枣庄市| 洛宁县| 永城市| 镇康县| 永胜县| 梧州市| 崇阳县| 祁阳县| 米易县| 松江区| 衡水市| 思茅市| 靖宇县| 龙川县| 张家港市| 平乡县| 蒲江县| 闵行区| 柞水县| 富阳市| 油尖旺区| 金寨县| 防城港市| 绥中县| 丰镇市|