如何正确处理SAP Kapsel脱机应用程序ODATA发生正确的冲突



i构建一个能够通过使用SAP KAPSEL插件来离线存储ODATA的应用程序。在此示例中,它或多或少与Web ID或类似器生成的应用程序相同:https://blogs.sap.com/2017/01/24/getting-started-with-with-kapsel-kapsel-part-10-offline-inkline-odatasp13/

现在,我正在检查误差分辨率电位。我创建了一个同步冲突(在离线数据库被存储并更改应用程序并开始齐平的情况下,服务器上的数据数据)。

如文档中所述,我可以看到错误构造中的错误,还可以看到一些细节。但是我缺少的是数据库中"当前"数据的信息。

在错误详细信息中,我只能在设备上看到数据,而不是在服务器上更改的数据。

例如:

  1. 设备将某些名称加载到离线商店
  2. 设备离线
  3. 用户A正在更改某些名称
  4. 用户B正在直接在线更改此名称之一
  5. 用户a再次在线并启动同步
  6. 用户A现在已通知已更改的实体,但:
    • 不是内容用户b输入

我只看到"离线"数据。

是否有一个解决方案可以在某种比较视图中查看"电流"one_answers"离线"?

还请注意,服务器通信是由Kapsel插件完成的,而不是正常的AJAX调用。这可能是另一种选择,但我想知道API是否没有更聪明的方式?

同时,我想出了如何(手动)加载在线数据。这可以通过将HTTP处理程序切换回正常一个来完成。

sap.OData.removeHttpClient();
sap.OData.applyHttpClient();

无论如何,这看起来不像是一个适当的解决方案,我也有冲突日志本身的问题。必须在应用任何刷新之前将其删除。

我找不到任何适当的文档。SAPUI5和SAP Kapsel文档中几乎没有描述ETAG处理。

这个问题是一个非常棘手的问题,因为它的含义。我了解您正在模拟由于并发修改而导致的同步错误,并想知道客户是否有办法获得"当前"服务器状态为了给用户一种比较本地和服务器状态的方法。

首先,让我给您简短的答案:不,客户无法查看当前服务器状态的"参考"。有离线API时有同步错误。如上所述,进行在线查询可能的工作,但这肯定是一个坏主意。

现在有更长的答案,这解释了为什么这不一定是一个缺陷,以及为什么我说对答案有很多影响。

同步错误的类型

我们区分了许多同步错误,在这种情况下,我们显然正在处理与业务相关的问题。这里有两个子类型:用户可以校正的子类型,例如验证错误以及在业务流程本身中问题的错误。

如果用户违反了输入范围,例如通过将产品的负价格放置,服务器将用相应的消息回复:" -1不是"价格"的有效输入值。作为开发人员,您可以通过错误存档向用户显示此类消息,随后的修复确实非常简单。

现在,当我们谈论并发修改时,事情变得非常非常讨厌。实际上,我想说的是,在这种情况下,业务流程存在问题,因为一方面,我们允许数据摆脱同步。另一方面,该过程允许多个用户操纵相同的信息。现在,应该如何通知和同步所有相关用户,而不仅仅是技术细节,实际上是一个新的业务流程。只是没有办法通用设备如何处理这种情况。在大多数情况下,这将涉及需要决定如何合并更改的后台专家。

更好的解决方案

Angstrom指出,无法在客户端操纵ETAG,实际上您甚至不应该考虑它。ETAG在乐观的锁定方案中像版本号一样工作,并且基本上更改ETAG的含义"只是覆盖服务器上的内容"。在严重的情况下,这是不做的。

an 可接受的解决方法是以下内容:

  1. 确保服务器返回详细错误消息,以便用户可以看到发生的事情和造成冲突的原因。
  2. 如果没有帮助,请刷新数据。这将为您提供更新的ETAG,并将本地更改合并到"当前"中。服务器状态,但仅在本地。"合并"确实意味着本地变化始终覆盖远程更改。
  3. 用户现在有另一个机会查看数据并可以再次提交。

一个好的解决方案

更好的不一定是好的,因此您应该真正做的事情:永远不要让并发修改发生,因为它确实很昂贵。这意味着不是开发人员应该解决此问题,而是业务需要更改流程。

正确的问题是,"当您在分布式系统中复制数据时,为什么要同时将其同时修改?"通常,利益相关者不会喜欢这种问题,适当的反应是与他们一起制定解决冲突的过程。只有这样,他们才会意识到这种不同步的固定量是多么昂贵的,而且通常不会看到调整流程比坚持另一个后台流程更便宜,以解决造成的问题。即使他们坚持需要进行这种并发的修改,他们现在也会理解,解决这不是您的任务,他们需要投资于解决冲突过程。

tl; dr

无法将服务器和客户端状态与客户端上的服务器状态进行比较,但是您可以刷新以保留本地更改并获得更新的ETAG。但是,真正的解决方案是重新制作业务流程,因为这不再是纯粹的技术问题。

默认解决方案是SMP或HCPMS正在通过ETAG检测错误。在客户端,没有API在发生冲突的情况下操纵ETAG。在设备上实现一种差异视图的潜在解决方案将像这样起作用:

  1. 显示错误
  2. 缓存错误(也许仅在内存中?)
  3. 删除错误
  4. 对数据库进行刷新
  5. 构建具有当前数据和缓存错误的DIFF视图

的想法
sap.OData.removeHttpClient();
sap.OData.applyHttpClient();

也可能起作用,但可能非常棘手,并且可能引入副作用。也许某些请求是针对"错误"后端触发的。

最新更新