一 序
本文屬於極客時間Elasticsearch核心技術與實戰學習筆記系列。
二 併發控制的必要性
兩個 Web 程序同時更新某個文檔,如果缺乏有效的併發,會導致更改的數據丟失
悲觀併發控制
- 假設有變更衝突的可能,會對資源加鎖,防止衝突。例如數據庫行鎖
樂觀併發控制
- 假設突然是不會發生的,不會阻塞正在嘗試的操作。如果數據在讀寫中被修改,更新將會失敗。應用程序決定如何解決衝突,例如重試更新,使用新的數據,或者將錯誤報告給用戶
- ES 採用的樂觀併發控制
例子是舉了銷售商品扣減庫存的。
2.1 ES 的樂觀併發控制
ES 中的文檔是不可變更的。如果你更新一個文檔,會將會文檔標記爲刪除,同時增加一個全新當文檔,同時文檔的 version 字段加 1
內部版本控制(老版本,已經被廢除)
- If_seq_no + If_primary_term(推薦)
使用外部版本(使用其他數據庫作爲主要數據存儲)
- version + version_type = external
demo
數據準備
嘗試去更新:
假設有別的用戶也去更新
會提示錯誤,也就說版本號只能執行一次
如果使用數據庫同步數據的場景,則可以使用version_type的方式更新