ES 筆記三十七:處理併發讀寫操作

CrazyZard發表於2019-12-25
  • 兩個Web程式同時更新某個文件,如果缺乏有效的併發,會導致更改的資料丟失
  • 悲觀併發控制
    • 假設有變更衝突的可能,會對資源加鎖,防止衝突。例如資料庫行鎖
  • 樂觀併發控制
    • 假設突然是不會發生的,不會阻塞正在嘗試的操作。如果資料在讀寫中被修改,更新將會失敗。應用程式決定如何解決衝突,例如重試更新,使用新的資料,或者將錯誤報告給使用者
    • ES 採用的樂觀併發控制

ES 筆記三十七:處理併發讀寫操作

  • ES中的文件是不可變更的。如果你更新一個文件,會將會文件標記為刪除,同時增加一個全新當文件,同時文件的version欄位加1
  • 內部版本控制
    • If_seq_no + If_primary_term
  • 使用外部版本(使用其他資料庫作為主要資料儲存)
    • version + version_type = external

ES 筆記三十七:處理併發讀寫操作

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
}

快樂就是解決一個又一個的問題!

相關文章