1. 程式人生 > >對於Zookeeper中提及的排它鎖、共享鎖和悲觀鎖、樂觀鎖的理解

對於Zookeeper中提及的排它鎖、共享鎖和悲觀鎖、樂觀鎖的理解

排它鎖

(簡稱X鎖),又稱為寫鎖或獨佔鎖,是一種基本的鎖型別。如果事務T1對資料物件O1加上了排它鎖,那麼在整個加鎖期間,只允許事務T1對O1進行讀取和更新操作,其它任何事務都幫你再對這個資料物件進行任何型別的操作,——直到T1釋放了排它鎖。

從上邊講解的排它鎖的基本概念中,我們可以看到,排它鎖的核心是如何保證當前有且僅有一個事務獲得鎖,並且鎖被釋放後,所有等待獲取鎖的事務都能被通知到。

共享鎖

(簡稱S鎖),又稱為讀鎖,同樣是一種基本的鎖型別,如果事務T1對資料物件O1加上了共享鎖,那麼當前事務只能對O1進行讀取操作,其它事務也只能對這個資料物件加共享鎖——直到該資料物件上的所有共享鎖都被釋放。

共享鎖和排它鎖最根本的區別在於,加上排它鎖後,資料物件只對一個事務可見,而加上共享鎖後,資料對所有的事務可見。

在zookeeper中,對於共享鎖的使用和在SQL中略有不同。
在需要獲取共享鎖時,所有的客戶端都會到/shared-lock這個節點下邊建立一個臨時資料節點,如果當前請求是讀請求,那麼在命名臨時節點的時候要表明是讀的,如果是寫請求,在建立節點命名時要表明是寫的。
根據共享鎖的定義,不同的事務都可以同時對同一個資料物件進行讀取操作,而更新操作必須在當前沒有任何進行讀寫操作的情況下進行的。基於這個原則,下邊簡述如何通過zookeeper的節點來確定分散式讀寫順序,大致可以分為四步。
1. 建立完節點後,獲取共享鎖下邊的所有子節點,並且對該節點註冊子節點變更的Wacher監聽。
2. 確定自己的節點序號在所有子節點中的順序。
3. 對於讀請求:
如果沒有比自己序號小的子節點,或是所有比自己序號小的子節點都是讀請求,那麼表明自己已經成功的獲取到了共享鎖,同時開始執行讀取邏輯。
如果比自己序號小的子節點中有寫請求,那麼就需要進入等待。
對於寫請求:
如果自己不是序號最小的子節點,那麼就需要進入等待。
4.接收到Wacher通知後,重複步驟1。

但是這種情況會帶來羊群效應(驚群效應)。
改進: 建立完節點後,獲取共享鎖下邊的所有子節點,不在對該節點註冊子節點變更的Wacher監聽。
對於讀請求:向比自己序號小的最後一個寫請求節點註冊wacher監聽。
對於寫請求:向比自己序號小的最後一個節點註冊Wacher監聽。

悲觀鎖

又被稱作悲觀併發控制(PCC),是資料庫中一種非常典型且非常嚴格的併發控制策略,悲觀鎖有強烈的獨佔和排它性,能夠有效的避免不同事務對同一資料併發更新而造成的資料一致性問題。在悲觀鎖的實現原理中,如果一個事務(假定是事務A)正在對資料進行處理,那麼在整個資料處理過程中,都會將資料處於鎖定狀態。在這期間,其他事務無法對這個資料進行更新操作,直到事務A完成對該資料的處理,釋放了對應的鎖之後,其他事務才能夠重新競爭來對資料進行更新操作。

樂觀鎖

又被稱作樂觀併發控制(OCC),也是一中常見的樂觀併發控制策略。相對於悲觀鎖而言,樂觀鎖的機制顯得更加友好與寬鬆。從上邊的介紹可以看到,悲觀鎖假定不同的事務之間的處理一定會出現相互干擾,從而需要在一個事務從頭到尾的過程中對資料進行加鎖處理。而樂觀鎖正好相反,它假定多個事務在處理的過程中不會彼此影響,因此在事務處理的絕大部分時間裡不需要進行加鎖處理。當然,既然有併發,就一定存在資料更新衝突的可能。在樂觀鎖機制中,在更新請求提交之前,每個事務都會首先檢查當前事務讀取資料後,是否有其他事務對該資料進行了更改。如果其他事務有更新的話,那麼正在提交的事務就會回滾。樂觀鎖適合使用在資料迸發競爭不大、事務衝突較少的應用場景中。

其實,我們可以把一個樂觀鎖控制的事務分成三個階段:資料讀取、寫入校驗和資料寫入。其中寫入校驗是整個樂觀鎖控制的關鍵所在。在寫入校驗階段(根據版本號去判斷),事務會首先檢查資料在讀取階段後是否有其他事務對資料進行了更新,以保證資料更新的一致性。

樂觀鎖不是資料庫自帶的,需要我們自己去實現。樂觀鎖是指操作資料庫時(更新操作),想法很樂觀,認為這次的操作不會導致衝突,在操作資料時,並不進行任何其他的特殊處理(也就是不加鎖),而在進行讀取後,再去判斷是否有衝突。

共享鎖和排它鎖是悲觀鎖的不同的實現,它倆都屬於悲觀鎖的範疇。

相關推薦

對於Zookeeper提及共享悲觀樂觀理解

排它鎖 (簡稱X鎖),又稱為寫鎖或獨佔鎖,是一種基本的鎖型別。如果事務T1對資料物件O1加上了排它鎖,那麼在整個加鎖期間,只允許事務T1對O1進行讀取和更新操作,其它任何事務都幫你再對這個資料物件進行任何型別的操作,——直到T1釋放了排它鎖。 從上邊講解的排

六十五主動模式被動模式添加監控主機添加自定義模板處理圖形的亂碼自動發現

監控主機 自定義模板 圖形亂碼 自動發現 六十五、主動模式和被動模式、添加監控主機、添加自定義模板、處理圖形中的亂碼、自動發現一、主動模式和被動模式主動或者被動是相對客戶端來講的被動模式,服務端會主動連接客戶端獲取監控項目數據,客戶端被動地接受連接,並把監控信息傳遞給服務端主動模式,客戶端會主

memcached的命令行導出導入php連接memcached存儲sessions

com 整數 lac 命令行 tar www 沒有 目錄 ini 1.memcached的命令行 telnet 127.0.0.1 11211set key2 0 30 2abSTOREDget key2VALUE key2 0 2abENDMemcached語法規則:&l

Ubuntu16.04CmakeQQ安裝火狐中文縮放比例設定

Cmake的安裝: 準備工作:官網下載cmake-3.6.3.tar.gz(https://cmake.org/download/) 1.解壓檔案tar -xvf cmake-3.6.3.tar.gz,並修改檔案許可權chmod -R 777 cmake-3.6.3 2.檢測gc

關於GCD序列佇列併發佇列同步執行非同步執行的探討

Dispatch Queues Dispatch queue是一個物件,它可以接收任務,並將任務以先到先執行的順序來執行。Dispatch queue可以使併發的或序列的。併發任務會基於系統負載來合適地併發執行,序列佇列同一時間只執行單一任務。 GCD共有三種佇列型別: 1

debian linux 如何檢視軟體包是否已經安裝如何安裝解除安裝軟體

如果您不確定某個軟體包是否已經安裝,可以使用 dpkg 的 -l (L的小寫) 選項: $ dpkg -l zsh No packages found matching zsh. 上面結果這表明 zsh 沒有 安裝。 可以使用 apt-cache 命令和它的 search 子命令來搜尋軟體包

股票買1買2買3賣1賣2賣3

        買方價格按照最高到最低排列,即買一最高,價格依次低一檔往下排列   賣方則相反,即賣一最低,價格一次高一檔往上排列   如果你看好股票,你想馬上買入成交,你就用賣盤上的價格發出指令,這樣系統會給你最優價格成交,就是賣方中價格最低的賣給你,這個交易是你主動買的

ElasticSearch學習(八)在Java應用實現批量操作(mget&bulk)查詢刪除match_all(查詢所有)

//mget批量查詢 @Test public void test6() throws Exception { //指定ES叢集 Settings settings = Settings.builder().put("clus

python語言是動態語言給類新增屬性方法靜態方法類方法__slots__()python的生成器yield的用法

程式在查詢變數的定義時遵循LEGB規則 LEGB規則: locals-->enclosing function-->globals-->builtins locals當前所在名稱空間的變數 enclosing外部巢狀函式的名稱空間(閉包中常見) globa

相對絕對路徑cd命令創建刪除目錄rm命令

相對和絕對路徑、cd命令、創建和刪除目錄、rm命令一、相對和絕對路徑、cd命令相對路徑:相對所在位置的路徑[root@centos-01 ~]# pwd #顯示當前目錄/root[root@centos-01 ~]# ls .ssh/authorized_keys #相對於/root.ssh/authori

Oracle loop循環while循環for循環if選擇case選擇更改讀取數據遊標觸發器存儲過程

bsp 邏輯或 pda 傳遞依賴 函數 名稱 執行 count 記錄 數據庫的設計(DataBase Design): 針對於用戶特定的需求,然後我們創建出來一個最使用而且性能高的數據庫! 數據庫設計的步驟: 01.需求分析 02.概念

絕對路徑相對路徑cd命令mkdir/rmdir命令rm命令

路徑和 權限 空目錄 date命令 local tor 解決 刪除 遙控 六、絕對路徑和相對路徑、cd命令、mkdir/rmdir命令、rm命令一、絕對路徑和相對路徑絕對路徑:路徑的寫法一定是由根目錄/寫起的,例如/usr/local/mysql。相對路徑:路徑的寫法不一定

二十四管道符作業控制shell變量環境變量配置文件

管道符和作業控制 shell變量 環境變量配置文件 二十四、管道符和作業控制、shell變量、環境變量配置文件一、管道符和作業控制管道符:| 表示把前面文件輸出的內容傳遞給後面的命令。|grep:過濾,指定關鍵詞的命令。|grep ’aaa‘。作業控制Ctrl+z:暫停一個任務

Linux自動掛載鏡像遠程桌面共享win7文件夾創建raid5卷創建HTML文件及靜態路由

自動掛載 遠程桌面 共享windows文件夾 raid5卷 靜態路由 Linux自動掛載鏡像、遠程桌面、共享win文件夾、創建raid5卷、創建HTML文件及網絡靜態路由綜合小實驗 環境描述:Linux01和win7分別是公司內網中的兩臺PC機,Linux02是公網上的一臺web服務器根

linux中斷介紹(概念頂半部底半部linux中斷程式設計)

中斷的概念: 指CPU在執行過程中,出現某些突發事件急待處理,CPU暫停執行當前程式,轉去處理突發事件,處理完後CPU又返回原程式被中斷的位置繼續執行.   中斷的分類: 內部中斷:來自cpu內部(軟體中斷、cpu溢位、觸發錯誤等) 外部中斷:來自cpu外部,由外設觸發

Direct3D基礎——預備知識:多重取樣畫素格式記憶體池交換鏈頁面置換深度快取頂點運算裝置效能

多重取樣 用畫素矩陣表示影象的時候往往會出現塊狀效應,多重取樣便是一項用於平滑塊狀影象的技術。 圖片來自:DirectX9.03D遊戲開發程式設計基礎 左邊那條是一條鋸齒線,右邊是一條經過取樣的反走樣線,看上去要平滑的多。 D3DMULTISAMPLE_TYPE列舉型別包含

java的知識點23——泛型GenericsCollection介面List特點常用方法 ArrayList特點底層實現

泛型Generics 一般通過“容器”來容納和管理資料。程式中的“容器”就是用來容納和管理資料。 陣列就是一種容器,可以在其中放置物件或基本型別資料。 陣列的優勢:是一種簡單的線性序列,可以快速地訪問陣列元素,效率高。如果從效率和型別檢查的角度講,陣列是最好的。 陣列的劣勢:不靈活。

深入淺出 - 公鑰私鑰數字簽名最通俗的理解

一、公鑰加密    假設一下,我找了兩個數字,一個是1,一個是2。我喜歡2這個數字,就保留起來,不告訴你們(私鑰),然後我告訴大家,1是我的公鑰。 我有一個檔案,不能讓別人看,我就用1加密了。別人找到了這個檔案,但是他不知道2就是解密的私鑰啊,所以他解不開,只有我可以

關於java的引數傳遞(值傳遞引用傳遞傳值傳引用等)

所謂引數傳遞就是用函式呼叫所給出的實參(實際引數)向函式定義所給出的形參(形式引數)設定初始值的過程。基本的有三種引數分別為: (1)傳值:   (2)傳址(即是傳指標) (3)傳引用 以上

十二python學習之python高階二(property魔法方法魔法屬性多繼承多重繼承閉包裝飾器)

一、property: 1.get/set方法: 1.1 隱藏實現細節:在使用物件時,儘量不要讓使用者直接操作物件中的屬性,這樣會帶來安全隱患。改進辦法,使用私有屬性。 1.2 提供精確的訪問控制:學習過 set/get方法,是專門來為類的私有屬性提供訪問介面。 1.