澄清复合操作的非原子性

时间:2015-11-18 19:52:43

标签: google-drive-realtime-api

This guide page强调复合操作是“非原子的”和“非交易”,但在那里给出并在下面复制的例子似乎并不表明它们不是交易。如果Bob的编辑首先到达,那么显示的最终结果与序列一致:

  • 所有Bob的编辑都已应用。
  • 然后应用所有Alice的编辑。

Bob的前两个编辑的问题是否实际未被应用,因此,例如,如果我们撤消Alice的编辑,我们最终会得到这个?:

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

我所引用的指南部分如下。

  

虽然复合操作中的编辑是一起传递的,但它们不是原子的。由于冲突解决,有可能从未传递复合操作中的某些编辑。想象一下两个编辑器同时修改同一个协作地图的协作场景。 Alice运行此代码:

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
}

1 个答案:

答案 0 :(得分:2)

Bob的编辑实际上是应用的,所以如果你撤消Alice的更改,那么它应该是Bob的改变。

但是,它仍然没有在传统数据库ACID意义上的事务性。唯一的保证是复合操作中的更改将同时应用,而不会混合其他更改。

例如,在典型的sql数据库事务中,如果在应用更改时出现问题,则会回滚所有更改。

在复合操作中,其中的每个更改都会被转换并单独应用。可能由于文档中的冲突发生变化,其中一个更改最终被删除(例如,它尝试更改的字符串的一部分已被删除。)在这种情况下,该部分更改似乎不会获得应用,但复合操作中的所有其他更改仍会发生。