複製衝突文檔的產生原理

來源:互聯網
上載者:User
複製衝突文檔的產生原理

前些天在討論 Domino
環境中各種 ID 時,提到了一些關於如何處理複製衝突的內容,由於其原理比較複雜,當時就沒有展開討論。今天有讀者詢問其中的細節,所以在這篇文章中我們就仔細研究一下這個話題。

上一次說到在複製過程中如果發現兩個副本關係的文檔其 OID 不同,那麼說明這兩個文檔處於不同步的狀態。首先分析兩個文檔的 $Revisions 域(此域記錄了文檔曆次修改的時間),判斷是否存在衝突:

  • 如果兩個域值除了某一個文檔多出來一些值以外,其餘部分完全相同,如:

    A:時間1,時間2,時間3

    B:時間1,時間2,時間3,時間4,時間5

    則表示 B 文檔在 A 文檔的基礎上額外多修改了兩次,不存在衝突

  • 如果兩個域值最初相同,然後各自出現了不同的部分,如:

    A:時間1,時間2,時間3,時間4

    B:時間1,時間2,時間3,時間5

    則表示兩個文檔在不同的時間分別修改過,存在衝突

如果存在衝突,下一步檢查目的文件(就是這次複製過程中會被修改的那個)的 $ConflictAction 域,如果其值為“1”表示允許合併式複寫衝突,開始分析兩個文檔各個域值,以判斷能否進行合并:

  • 首先通過 $Revisions 域和 Sequence Number 找出兩個文檔最後一致的版本,以下面資料為例:

    A $Revisions:時間1,時間2,時間3,時間4

    A SN:5

    B $Revisions:時間1,時間2,時間3,時間5

    B SN:5

    兩個文檔在時間3這一版本是一致的,從 SN = 5 往回反推可以得到一致版本為 4

  • 每個文檔域也有一個 SN 屬性,它記錄了此域最後一次修改時文檔的 SN。用文檔域的 SN 與之前得到的一致版本號碼 4 進行比對,就可以得到在一致版本之後修改的域。
  • 如果兩個文檔修改過的域有重合的部分,說明在不同的副本中對相同的域同時做了修改,無法合并衝突;反之則可以合并

如果 $ConflictAction 域值不是“1”或者屬於上一段所述無法合并衝突的情況,則必須建立衝突文檔。下一步就是通過 Sequence Number 和 Sequence Datetime 來分析哪個文檔作為主文件(winner),哪個文檔作為衝突文檔(loser):

  • SN 比較大的(在一致版本之後編輯次數較多的)文檔是 winner
  • 如果 SN 相同,SD 比較大的(最後編輯的)文檔是 winner

至此,一個嶄新的複製衝突文檔誕生了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.