1. 程式人生 > >25.partial update內置樂觀鎖並發控制

25.partial update內置樂觀鎖並發控制

sans 沖突 amp 數據返回 update gpo tro 知識點 把他

主要知識點

1partial update內置樂觀鎖並發控制

2retry_on_conflict

post /index/type/id/_update?retry_on_conflict=5&version=6

一、一般情況下partial update實現過程

用戶直接修改field,然後發送給應用程序,由應用程序直接發送給ES,和全量替換相比,全量替換要先去es進行查找,把查找的數據返回給應用程序,然後再次返回給用戶界面,只有這樣用戶才知道要替換什麽,partial update少了先查找的這一步。在es內部,由es先把原來舊的數據查找出來(得到數據和_version值),

partial update的數據更新到這份數據中(帶著_version值),然後把原來舊的數據標記為deleted,把新的數據進行替換。由此可以看出,用戶是用的partial update,但是在ES內部,仍然是全量替換。但是在替換過程中仍然遵循樂觀鎖的控制策略。

二、並發情況下partial update實現過程

線程1取得es中的一條數據,此時_version=1,取得這條數據時對他進行partial update

在線程1取得es中的數據後,線程二也取得該數據,並對該數據進行了修改,並寫回了es,此時es中該數據的_version=2,

當線程1把他取的數據進行修改後,重新寫回es時,所帶的_version =1 ,因為此時es中_version=2,所以修改不成功,es自動將該次

partial update fail掉,也就是這種情況下線程一的修改被es自動忽略。es內部會自動執行樂觀鎖的並發控制策略。

三、當_verion沖突時的辦法

線程一寫回數據時產生_version沖突,在這種情況下,就可以用以下語法:

1post /index/type/id/_update?retry_on_conflict=5

retry策略:

1 再次獲取該document的數據和最新的版本號

2 基於最新的版本號再次去更新,如果成功就OK

(3) 如果不成功就再一次執行1和2的步驟,最多執行5次。

2post /index/type/id/_update?retry_on_conflict=5&version=6

指定版本號,也就是說當這次更新成功後的版本號就是6

25.partial update內置樂觀鎖並發控制