- 兩個Web程式同時更新某個文件,如果缺乏有效的併發,會導致更改的資料丟失
- 悲觀併發控制
- 假設有變更衝突的可能,會對資源加鎖,防止衝突。例如資料庫行鎖
- 樂觀併發控制
- 假設突然是不會發生的,不會阻塞正在嘗試的操作。如果資料在讀寫中被修改,更新將會失敗。應用程式決定如何解決衝突,例如重試更新,使用新的資料,或者將錯誤報告給使用者
- ES 採用的樂觀併發控制
- ES中的文件是不可變更的。如果你更新一個文件,會將會文件標記為刪除,同時增加一個全新當文件,同時文件的version欄位加1
- 內部版本控制
- If_seq_no + If_primary_term
- 使用外部版本(使用其他資料庫作為主要資料儲存)
- version + version_type = external
DELETE products
PUT products
PUT products/_doc/1
{
"title":"iphone",
"count":100
}
GET products/_doc/1
//只能執行一次
PUT products/_doc/1?if_seq_no=0&if_primary_term=1
{
"title":"iphone",
"count":110
}
//資料庫版本號為主
PUT products/_doc/1?version=23&version_type=external
{
"title":"iphone",
"count":130
}