我遇到以下问题,我正在无状态 REST 服务器中使用 RavenDB 实现队列抽象。
假设我有 2 个 REST 调用 A 和 B
当调用 A 发生时,我查询队列中的最后一项(项 A )并将其交给调用 A。
如果调用 B 与调用 A 同时调用 - 这可能在 REST 调用中发生,我需要防止程序向调用 B 提供与 A 相同的项目,这意味着项目 A 应该被调用 A“锁定” .
这里的标准多线程保护将是一个简单的锁,我如何将这个想法转化为我使用 RavenDB 和 REST 的情况?
P.S我用Nancy对于 REST 服务器
最佳答案
这应该不会太难,除非我错过了一些东西:
在您的项目上引入一个标志( bool 属性),例如“处理”。
在您的操作中,打开一个新的 RavenDB session 并在其上启用乐观并发 (DocumentSession.Advanced .UseOptimisticConcurrency
)。
获取下一个未处理的项目,然后立即将其已处理标志更新为 true。
在 session 中调用 .SaveChanges
-> 如果成功(您不会收到 ConcurrencyException
),您可以安全地返回该项目作为请求的结果。如果没有,则加载下一个项目。
关于rest - 如何在 RavenDB 中实现文档的原子并发读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8705813/