【问题标题】:Concurrent user gets handle to same document at the same time并发用户同时获取同一个文档的句柄
【发布时间】:2013-12-19 17:56:00
【问题描述】:

我们在 Notes 数据库上遇到了一个罕见的生产问题。我们的系统在提交期间为请求文档分配一个 ID(实时保存然后提交)。发生的情况是,有时 2 个文档似乎具有相同的 ID,但情况并非如此。

ID 的格式为 YYYY-MM-XXX,其中 YYYY 是当前年份,MM 是月份,XXX 是从 001 开始的数字。系统在分配 id 时,会检查同一月份的文档所在的视图。如果没有看到文档,则在 ID 中分配 001,否则,它会获取视图中的最新文档,获取编号,然后将其加 1。然后将新编号分配为 ID。

如何确保在此过程中,我可以根据上述条件分配一个唯一的 ID?该错误非常罕见,我们无法再次模拟它。感谢您的帮助!

【问题讨论】:

  • 身份证复印件是否同时提交?数据库是否仅在一台服务器上,不用作本地副本?

标签: lotus-notes lotusscript notesview


【解决方案1】:

您可以使用 NotesDocument 对象的 lock 方法先锁定文档,然后再更新其中的数字。如果另一个用户进来,脚本需要等到锁被释放。一旦锁定被释放,下一个用户可以锁定它来更新它。

【讨论】:

    【解决方案2】:

    一些代码有助于找出问题所在,但听起来在提交文档的两个用户之间存在竞争条件,他们都同时查看视图。

    在查看视图、获取最新文档、将其加一、将其存储在文档中、保存该文档、然后更新视图以便下次视图被检查最新的文档有一个更高的数字。您真正需要的是包装所有内容的东西,因此它只能同步发生。说起来容易做起来难。

    我建议使用@UNIQUE 公式,它(我相信)保证是唯一的,而不是 ID 的 XXX 部分。如果您使用 XXX 部分进行排序,也许您仍然可以将该序列号保存在文档中的某个位置,最坏的情况是您将拥有两个具有相同排序键的文档,这可能满足您的需求。

    【讨论】:

    • 我见过相当多的 id 使用 unique 来计算是相同的。可能它与我在 Evaluate: Evaluate("@Unique") 中的使用有关,但我不得不放弃它并使用自编码算法
    • 我没有亲眼见过,但是在写这个答案时我想到了。我也找不到任何可以保证它是唯一的东西,这意味着它可能无法保证。也许自己滚动是最安全的:)
    【解决方案3】:

    根据@Ken Pespisa 的回答,@Unique 更有可能为您提供独特的价值,但并不能真正保证。如果两个具有相似姓名的用户(即,相同的首字母大写、相同的姓氏前两个字母和相同的姓氏最后一个字母)在完全相同的时间(根据系统时钟)在两台不同的客户端计算机上执行 @Unique,则仍然可能发生碰撞。概率很低,但不是零。

    可以在 Andre Guirard 的文章 here 中找到关于为 Notes 文档分配不规则的顺序 ID 的详细讨论。在我看来,最好的技术是推迟分配唯一的顺序 id,并让运行在服务器上的代理来创建 id。这提供了唯一性的真正保证(只要您正确编码)。权衡是 id 不能立即可用。

    【讨论】:

      猜你喜欢
      • 2021-05-07
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多