我已經爲MongoDB的documentation中描述的MongoDB實現了兩階段提交。基本上,這工作正常。因爲我所關心的是插入新文檔,所以我從不更新它們。如何解決與MongoDB和兩階段提交多個併發寫入?
然而,我擔心一個特定的情況,我不知道如何解決這個問題。所以任何幫助,將不勝感激。
考慮:一個包含文檔結構如下集合:
id: ...,
subId: ...
payload: {
...
}
可能有不止一個文件具有相同id
,但具有相同的id
所有文檔都越來越subId
。所以,你有這樣的:
- 1 - 1
- 1 - 2
- 2 - 1
- 3 - 1
- 3 - 2
- 3 - 3
每個插入僅處理一個id
,但可能提供多個文檔。所以這意味着可能會有插入文件3 - 4
和3 - 5
,但從不插入文件3 - 4
和4 - 1
。
id
和subId
字段是由客戶端插入數據計算的。
插入多個文檔時,此插入由2PC覆蓋。所以所有的文件都提交或沒有。
現在的問題出現在2PC的第二階段。由於我不希望其他客戶端能夠讀取未提交的數據,因此每個文檔中都有一個標誌,告訴我文檔是否已經提交。一旦所有文件都被寫入並且交易已被設置爲「已完成」,作爲最後一步,文件被標記爲已提交。
所以,現在,如果我嘗試插入3 - 4
和3 - 5
,都獲得書面發生什麼情況,交易完成後,和3 - 4
被標記爲承諾,和之前3 - 5
被標記爲承諾,另一客戶端讀取ID爲3
所有文件,將子目錄4
視爲最高一個,用3 - 5
創建一個新文件並插入它?
然後提交失敗,我有兩個交易的混合版本號。
如何解決這個問題?