ElasticSearch內部基於_version樂觀鎖控制機制

|舊市拾荒|發表於2022-03-07

1、悲觀鎖與樂觀鎖機制

為控制併發問題,我們通常採用鎖機制。分為悲觀鎖和樂觀鎖兩種機制。

悲觀鎖:很悲觀,所有情況都上鎖。此時只有一個執行緒可以運算元據。具體例子為資料庫中的行級鎖、表級鎖、讀鎖、寫鎖等。

特點:優點是方便,直接加鎖,對程式透明。缺點是效率低,併發能力非常弱。

  

樂觀鎖:很樂觀,對資料本身不加鎖。提交資料時,通過一種機制驗證是否存在衝突,如es中通過版本號驗證。

特點:優點是併發能力高。缺點是操作繁瑣,在提交資料時,高併發的情況下,可能反覆重試多次。

  

2、內部基於_version樂觀鎖控制

es對於文件的增刪改都是基於版本號。

第一次執行

PUT /test_index/_doc/4
{
  "test_field": "test"
}

此時可以版本號為1

  

在執行一次:

  

此時版本號已變為2,且result的值也為update

在執行刪除文件操作

DELETE /test_index/_doc/4

  

版本號變為3,result的值為deleted

再執行一次新增語句,注意這裡要和前一條刪除語句間隔時間不要太長,最好立即執行。

PUT /test_index/_doc/3
{
  "test_field": "test"
}

可以看到版本號依然遞增,並且驗證成功延遲刪除策略。

  

因為如果刪除一條資料立馬刪除的話,所有分片和副本都要立馬刪除,對es叢集壓力太大。

3、圖解es內部併發控制

  

es內部主從同步時,是多執行緒非同步。採用樂觀鎖機制。

相關文章