解决冲突与微风

时间:2015-04-23 01:24:33

标签: javascript concurrency breeze optimistic-concurrency

如何在breeze.sharp或breeze.js中实现冲突解决方案,以及它与新发布的Azure" AsyncTable"相比如何?冲突处理?

场景是这样的:一个实体(例如Person)从之前的服务器提取中保存在breeze缓存中(保存缓存中数据的原因是让用户可以在app上工作)而移动设备与互联网断开连接)。当移动设备离线时,用户编辑人员的一些细节(例如,编辑姓氏)。与此同时,其他人编辑了同一个人的姓氏,并成功保存回Azure(或中央MS SQL)数据库。然后移动设备再次联机并将其更新(已存储在本地缓存中,直到现在)发送到服务器。

我的问题是,怎样才能/应该用微风来开辟选择"胜利者"这两个相互矛盾的更新之间?决定获胜者的机制不是问题。我想知道如何最好地有机会做出这个决定 - 然后如何让胜利者的姓氏版本保留在失败者的一方(即移动设备)或服务器DB)。

最接近我设法得到答案的是关于"保存更改"它所说的页面"此页面尚未准备好发布。它将涵盖:...并发和DataProperty.concurrencyMode"。

我不确定这个要求是否可以通过乐观并发来正确实现,或者是否更类似于Azure的方式(实体上的版本字段以及其他未知的魔法冲突解决和同步逻辑)被要求在微风中做这项工作吗?

1 个答案:

答案 0 :(得分:1)

  

我想知道如何最好地有机会做出这个决定 - 然后如何让胜利者的姓氏版本坚持在失败者一方(即移动设备或服务器数据库)。

我正在使用带有Entity Framework / MS SQL后端的breeze。以下是我在客户端识别并发异常的方法:

export function isConcurrencyException(reason: any): boolean {
  return reason.message && /Store update, insert, or delete statement affected an unexpected number of rows/.test(reason.message);
}

entityManager.saveChanges()
  .fail(reason => {
    if (isConcurrencyException(reason)) {
      // ... concurrency exception handling logic ...
    }
    // detect other failure reasons (connection issue, server-side validation error, etc)
  });

在您确定并发异常之后该怎么做,这很难,每个应用都是不同的。需要考虑几个方案,包括非冲突的属性编辑,冲突的属性编辑以及其他用户删除您尝试保存的实体的情况。 Breeze的MergeStrategy可能会在您的解决方案中发挥作用。