This guide page强调复合操作是“非原子的”和“非交易”,但在那里给出并在下面复制的例子似乎并不表明它们不是交易。如果Bob的编辑首先到达,那么显示的最终结果与序列一致:
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
}
答案 0 :(得分:2)
Bob的编辑实际上是应用的,所以如果你撤消Alice的更改,那么它应该是Bob的改变。
但是,它仍然没有在传统数据库ACID意义上的事务性。唯一的保证是复合操作中的更改将同时应用,而不会混合其他更改。例如,在典型的sql数据库事务中,如果在应用更改时出现问题,则会回滚所有更改。
在复合操作中,其中的每个更改都会被转换并单独应用。可能由于文档中的冲突发生变化,其中一个更改最终被删除(例如,它尝试更改的字符串的一部分已被删除。)在这种情况下,该部分更改似乎不会获得应用,但复合操作中的所有其他更改仍会发生。