面試常問之~悲觀鎖和樂觀鎖

            我們在開發中,有時候常常去實現一些業務的功能實現,往往忽略了很多源頭的東西,這也是我身邊有很多業務超級強的人,但是一旦跳槽以及面試會被一些東西卡掉,你要說他真的不知道嗎?其實不是,只是很多東西,我們常用,但是沒有深入去了解或者不能再面試時候給出官方的解釋(這一點我真的很煩)下面就悲觀鎖和樂觀鎖給出我的理解,當然我也是面試經常會被問到,我一般都是按照自己理解去回答 ,從來不去官方解釋(每個人不一樣,只要大家覺得適合自己的就行.)

  一般面試官會從和幾個點問你:

       1.什麼是鎖? 

       2.你知道悲觀鎖和樂觀鎖?

       3.你可以大概簡單講一下你的理解? 

  一般這三個問題是層層遞進的,一般問道鎖了 就心裏要想了 ,千萬不要不懂裝懂,一定把自己最拿手最熟悉的說出來.好啦,進入正題.

   一: 首先理解鎖:

              我的認爲:鎖的出現必定是因爲併發纔會有的東西,因爲在併發的情況下,鎖是來控制多個操作順序,保證數據安全變動的一個很好的東西,鎖一般最多是在: 多線程中的鎖  和  數據庫的鎖.

比如在數據庫層,一個表中同一個數據,同時多個修改操作過來,那數據庫就會給表鍾該行數據上鎖,通常也叫行鎖.我們今天說的悲觀鎖以及樂觀鎖是基於數據庫層面的,跟程序中的多線程中的鎖是不一樣的.

       悲觀鎖:

              從字面意思來看,這傢伙就是很悲觀,我更喜歡叫它謹慎鎖.從數據庫層來講:

1.去拿數據,會認爲在此同時會有人也來動這個數據,所以它就會上鎖.

2.這樣,別人要是也操作這個數據,就需要它那邊完事,釋放鎖之後.

   這個機制其實對應於我們常說你的    行鎖 表鎖  讀鎖  寫鎖 

  

樂觀鎖

      就是很樂觀,我一般叫大意鎖.從數據庫層來講:

 1.去拿數據,會認爲在此同時不會有人也來動這個數據,所以它就不會上鎖.

2.但是,不上鎖不代表就會不負責,一般在最後更新數據的時候,一般使用版本號來處理.(問版本號如何處理?

         樂觀鎖通常是通過在表中增加一個版本或時間戳來實現,一般常用版本。

 例如:

   A操作數據庫數據時候 

 1. 從數據庫中取數據時附帶了版本號 

 2. A操作後對數據有變動最後想要將其存到表中時,這個時候會將之前取出的數據中的版本號與數據庫表中最新的版本號相對比,

 3.  如果兩版本一樣,那麼說明在數據變動期間,沒有其他事務對數據進行修改,此時,就允許A操作對錶中的數據進行修改成功,同時會將版本號進行+1操作

 4. 如果不相等,那就證明有人動過該數據,就不準A操作成立,讓其重新操作一遍.

 好啦,到這裏 你會發現 他們兩個雖然最後都保證了數據的安全,但是,如果一個數據被修改的情況很少,我們使用悲觀鎖每一次加鎖勢必耗時,所以,場景就出來了,一般的話樂觀鎖適用於寫比較少的情況下,悲觀鎖適用於讀比較少的情況下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章