另一个用户修改了记录(NAV webservice)

Another user has modified the record (NAV webservice)

我遇到了一个很难调试的错误。

我有一个工具可以访问 Dynamics NAV 页面服务以在我们的 Dynamics NAV 数据库中创建 and/or 更新客户。

该工具在 50% 的情况下工作得很好,另外 50% 的情况下它没有,并且总是出现相同的错误:

其他用户已修改"service_name""No.=CONST(customer_number)"

问题是在 NAV 中编辑被禁用,所以唯一可以编辑记录的是工具本身。

当我在网上搜索时,我得到类似 "you try to modify the same record twice" 和一堆 NAV 代码的结果,但我无法访问 NAV 代码,而与我们合作的 NAV 顾问自己也一无所知.

如果有人能以某种方式指出不涉及 NAV 代码的可能场景,那就太棒了。

我的工作流程如下:

  1. 我从 NAV 中检索记录
  2. 我在需要的地方编辑和修改记录
  3. 我创建and/or更新修改记录
  4. 要么成功,要么出现上述错误

无论哪种方式,我在整个过程中只调用了一次更新方法。

请帮帮我...我一窍不通

亲切的问候

我最近遇到了这个问题。我不确定它是哪个版本的 NAV,因为我自己并没有真正使用 NAV,只是使用它的网络(肥皂)服务。 但是我认为这个问题在最新版本中也是一样的,因为它不是一个错误。

无论如何,据我了解,NAV 这样做是为了维护数据库的 ACID 规则。 在这种特殊情况下,NAV 会阻止 "dirty write",这意味着它会阻止您更新某些已更改为比您拥有的(或者说您拥有的)更新版本的数据。

对于刚刚更新实体然后想再次更新它的人来说,这可能看起来很奇怪,因为他知道没有其他人在使用该系统或处理数据 - 但这是一个简单的原因。

更新实体时,您为其关键属性提供了一个值。该值不仅包含实体的唯一标识符,如果您愿意,还可以包含时间戳或版本描述。 这意味着键值是 "one shot" 的东西 - 如果您正在更改实体的状态,则不能多次使用它。

因此,当您使用键 "abcdefg" 更新实体时(只是一个示例),它是成功的。 但是下一次(也许 5 秒后)你想更新实体并使用相同的键 "abcdefg" 它会 100% 确定地失败。

那么如何解决这个问题,很简单,因为 Update 方法将要更新的实体作为引用 (ref) 参数,因此一旦成功更新实体,它的键属性就会有一个新值,并且这是实体的当前状态 - 将此值用于下一次更新等。

这并不意味着您总是必须先检索实体才能更新它。该服务有一种检查是否有必要的方法。

service.IsUpdated(obj.Key);

如果 returns false,您可以继续使用您拥有的键值更新实体,如果 true,那么您需要检索一个新副本,因为您的密钥中描述的实体状态已过时。

希望这是有道理的,并且会帮助处于我和 OP 所处相同情况的其他人:)