2015-11-18 28 views
0

This guide page強調複合操作「不是原子」和「不是事務」,但在那裏給出並在下面複製的示例似乎並未證明它們不是事務。如果Bob的編輯首先到達,那麼顯示的最終結果與該序列一致:澄清複合操作的非原子性

  • 所有Bob的編輯都已應用。
  • 然後所有愛麗絲的編輯都被應用了。

是Bob的前兩個編輯沒有實際應用,因此,例如,如果我們取消Alice的編輯,我們將結束與眼前這個?:

{ 
    'address' : 'Anytown, USA' // Bob's address! 
} 
問題

我參考的指南部分如下。


雖然在一個複合操作進行的修改被遞送在一起時,它們不是原子。由於衝突的解決,可能會導致複合操作中的某些編輯操作不會被執行。想象一下兩個編輯人員同時修改同一個協作地圖的協作場景。愛麗絲運行此代碼:

model.beginCompoundOperation(); 
myCollaborativeMap.set('name', 'Alice'); 
myCollaborativeMap.set('phone', '555-5309'); 
model.endCompoundOperation();` 

和鮑勃運行此代碼:

model.beginCompoundOperation(); 
myCollaborativeMap.set('name', 'Bob'); 
myCollaborativeMap.set('phone', '555-0000'); 
myCollaborativeMap.set('address', 'Anytown, USA'); 
model.endCompoundOperation(); 

如果Bob的編輯在服務器第一個到達終點,在地圖的內容最終會解析爲:

{ 
    'name' : 'Alice',   // Alice's name 
    'phone' : '555-5309',  // Alice's number 
    'address' : 'Anytown, USA' // Bob's address! 
} 

如果Alice的編輯在服務器第一個到達終點,在地圖的內容將是:

{ 
    'name' : 'Bob',   // Bob's name 
    'phone' : '555-0000',  // Bob's number 
    'address' : 'Anytown, USA' // Bob's address 
} 

回答

2

Bob的編輯被實際應用,因此,如果您撤消Alice的變化,那麼它應該是Bob的變化結果。

但是,它在傳統數據庫ACID中仍然沒有事務性意義。唯一的保證是複合操作中的更改將一起應用,而不會混淆其他更改。

例如,在典型的sql數據庫事務中,如果應用更改時發生問題,則所有更改都會回滾。

在複合操作中,它內部的每個更改都會分別進行轉換和應用。它可能由於文檔中的變化衝突,其中一個變化最終被清除(例如,它試圖更改的一部分字符串已被刪除。)在這種情況下,這部分更改似乎不會獲得應用,但複合操作中的所有其他更改仍會發生。