對於通常的ES操做流程是:
一、先get document數據,好比獲取到商品數據,將數據顯示到網頁上,同時在內存中緩存該documentd的數據
二、當網頁發生了購買後,直接基於內存中的數據,進行計算和操做
三、將計算後的結果寫回ES中緩存
下面描述一下場景
好比在電商場景下,假設說,咱們有一個程序,工做流程以下:
一、讀取商品的信息
二、用戶下單購買
三、更新商品信息(主要是將庫存減1)
咱們假設程序是多線程的,因此說可能有多個線程併發的去執行上述的3個步驟流程多線程
將上述場景具體到某個商品的庫存修改的時候,假設一個牙膏的庫存是100件,如今同時有兩我的都過來讀取了牙膏的數據,而後下單購買了這管牙膏,此時兩個線程併發執行,同時在進行商品庫存的修改。併發
如圖所示,在正常的狀況下,咱們指望線程A將庫存-1,設置爲99件;而後線程B接着這個99件,將庫存-1,變爲98件,而後寫入到ES中。
可是總有一個線程是先到的,假設就是線程A,此時線程A就會先將牙膏的庫存設置爲99件,而後線程B再次將牙膏的庫存設置爲99件,結果很顯然就不是咱們想要的。spa
上述的這個流程,其實就是ES中的併發衝突問題,會致使數據不許確。線程
這裏先附上中華石衫老師畫的手工圖blog
下面簡單作一下描述和歸納
悲觀鎖:所謂悲觀鎖就是在任何狀況下都上鎖,上鎖以後,就只有一個線程能夠操做這一條數據,其它線程只能等待,固然在不一樣的場景下,上的鎖會有所不一樣,能夠是行級鎖,表級鎖,讀鎖,寫鎖。通俗的來說,加了悲觀鎖的話,對數據操做的時候就至關因而單線程的了。
樂觀鎖:其實所謂的樂觀鎖,根本就沒有加鎖,只是多了一標識字段,這個字段能夠是一個整數類型的,也能夠是時間類型的。主要的做用就是在每次修改數據的時候會作一層判斷,判斷數據是否已經被修改過了,若是已經被修改了,那麼就會從新獲取數據,在修改,這個過程不斷進行知道數據修改爲功。圖片
下面比較一下兩種鎖的優缺點
一、對於悲觀鎖,它使用起來很方便,直接加鎖就能夠了,對於應用程序來講,它是透明的,不須要作額外的操做。可是每次都須要獲取到鎖以後才能對數據進行修改,也就是同一時間只能有一個線程可以進行操做,併發能力很低
二、對於樂觀鎖,它根本就沒有加鎖,因此併發能力很高。可是每次更新數據的時候都須要對標識字段作一個判斷,這個過程可能要重複不少遍。並且是須要應用程序作處理的。內存
對於ES來講,它是採用樂觀鎖,對應的樂觀鎖的標識字段是_version,是一個整數類型,一開始建立document時,_version是等於1的,以後對document每修改一次,_version版本號就會自動加1。get