2012-09-29 20 views
0

我已經爲MongoDB的documentation中描述的MongoDB實現了兩階段提交。基本上,這工作正常。因爲我所關心的是插入新文檔,所以我從不更新它們。如何解決與MongoDB和兩階段提交多個併發寫入?

然而,我擔心一個特定的情況,我不知道如何解決這個問題。所以任何幫助,將不勝感激。

考慮:一個包含文檔結構如下集合:

id: ..., 
subId: ... 
payload: { 
    ... 
} 

可能有不止一個文件具有相同id,但具有相同的id所有文檔都越來越subId。所以,你有這樣的:

  • 1 - 1
  • 1 - 2
  • 2 - 1
  • 3 - 1
  • 3 - 2
  • 3 - 3

每個插入僅處理一個id,但可能提供多個文檔。所以這意味着可能會有插入文件3 - 43 - 5,但從不插入文件3 - 44 - 1

idsubId字段是由客戶端插入數據計算的。

插入多個文檔時,此插入由2PC覆蓋。所以所有的文件都提交或沒有。

現在的問題出現在2PC的第二階段。由於我不希望其他客戶端能夠讀取未提交的數據,因此每個文檔中都有一個標誌,告訴我文檔是否已經提交。一旦所有文件都被寫入並且交易已被設置爲「已完成」,作爲最後一步,文件被標記爲已提交。

所以,現在,如果我嘗試插入3 - 43 - 5,都獲得書面發生什麼情況,交易完成後,和3 - 4被標記爲承諾,和之前3 - 5被標記爲承諾,另一客戶端讀取ID爲3所有文件,將子目錄4視爲最高一個,用3 - 5創建一個新文件並插入它?

然後提交失敗,我有兩個交易的混合版本號。

如何解決這個問題?

回答

0

哦,忘了它......典型的「我在看到它時看到它」的情況。我描述的場景是沒有問題的,因爲3 - 5已經被第一個事務寫入,它只是沒有提交。因爲​​3210上有一個唯一的索引約束,所以另一個事務不能干涉。

問題解決。