Elasticsearch7.9:二、索引並發控制


  首先我們需要清楚:

  ES 中的文檔是不可變更的。如果你更新一個文檔,會將文檔標記為刪除,同時增加一個全新的文檔,與此同時文檔的 version 字段也會加 1。

  那么 es7.x 之后,對應的 version 讓然保留着,但是內部樂觀鎖版本控制是通過另外兩個新引入的字段來控制的,分別是:seq_no 和 primary_term,漢語翻譯過來就是:序列號 和 主項。

如何進行事務控制呢?

  在創建一個新文檔時,會為其分配一個初始化的序列號(_seq_no)和主項(_primary_term)。

  在此之后如果對文檔有新的變更,序列號會遞增。我們可以通過 GET api 可查看指定文檔當前的序列號和主項。

  在調用 INDEX、UPDATE、DELETE api 時,通過在 url 傳遞參數 if_seq_noif_primary_term 來分別指定 序列號 和 主項,

  這樣:只有在要操作的文檔的序列號和主項為指定值時才會對文檔執行指定操作,否則會返回 version_conflict_engine_exception 異常 和 狀態碼 409。

  例如:索引中有如下文檔

  

  試圖執行以下更新:

    POST user/_update/dGuQgm0BTkzY5ivQV2rk?if_seq_no=12&if_primary_term=1
    {
      "doc":{
        "date":"2019-10-01T00:23:42"
      }
    }

  則會返回如下錯誤:

  

   這樣就保證了不會丟失序列號為11,主項為1的操作。

   如果 傳入的參數與為:if_seq_no=10&if_primary_term=1

   則最終更新會成功,通過 GET api 查看你會看到 _seq_no = 11。

外部版本控制

  使用外部版本控制,即使用其他數據庫作為主要數據存儲,這個和原來的方案是一樣的,並沒有發生什么變化,即:

  version + version_type = external

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM