并发用户同时获取同一文档的句柄

时间:2013-12-19 17:56:00

标签: lotus-notes lotusscript notesview

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

ID的格式为YYYY-MM-XXX,其中YYYY为当前年份,MM为月份,XXX为从001开始的数字。系统在分配ID时,会在视图中检查相同月份的文档。如果它没有看到文档,它会在ID中分配001,否则,它会获取视图中的最新文档,获取数字,然后将其递增1.新数字将被指定为ID。

我如何确保在此过程中,我可以根据上述标准指定唯一ID?这个bug非常罕见,我们无法再次模拟它。谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

在逻辑中查看视图,获取最新文档,将其递增1,将其存储在文档中,保存该文档,然后更新视图以便下次更新时,会有很多时间过去视图被检查最新的doc有更高的数字。你真正需要的东西是包裹所有这一切所以它只能同步发生。这说起来容易做起来难。

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

答案 2 :(得分:0)

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

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