我遇到以下问题,我在无状态REST服务器中使用RavenDB实现队列抽象。
假设我有2个REST调用A和B
当调用A发生时,我在队列中查询最后一个项目(项目A)并将其命名为A。
如果呼叫B与呼叫A同时被呼叫 - 这可能发生在REST呼叫中,我需要阻止程序给呼叫B提供与A相同的项目意味着项目A应该被呼叫A“锁定”
这里的标准多线程保护是一个简单的锁,如何将这个想法转化为我的RavenDB和REST情况?
P.S我使用Nancy作为REST服务器
答案 0 :(得分:5)
除非我错过了什么,否则不应该太难:
在您的商品上引入一个标志(布尔属性),例如“处理”。
在您的操作中,打开一个新的RavenDB会话并在其上启用乐观并发(DocumentSession.Advanced .UseOptimisticConcurrency
)。
获取下一个未处理的项目,然后立即将其已处理的标志更新为true。
在您的会话中致电.SaveChanges
- >如果成功(您没有获得ConcurrencyException
),则可以安全地返回该项作为请求的结果。如果没有,请加载下一个项目。