如何在RavenDB中实现文档的原子并发读取?

Dav*_* MZ 2 queue rest concurrency thread-safety ravendb

我有以下问题,我在无状态REST服务器中使用RavenDB实现队列抽象.

假设我有2个REST调用A和B.

当呼叫A发生时,我在队列中查询最后一个项目(项目A)并给它打电话A.

如果呼叫B与呼叫A同时被呼叫 - 这可能发生在REST呼叫中,我需要阻止程序给呼叫B提供与A相同的项目,意味着项目A应该被呼叫A"锁定".

这里的标准多线程保护是一个简单的锁,如何将这个想法转化为我的RavenDB和REST的情况?

PS我使用Nancy作为REST服务器

Dan*_*ang 5

除非我错过了什么,否则这不应该太难:

在项目上引入一个标志(布尔属性),例如"已处理".在您的操作中,打开一个新的RavenDB会话并在其上启用乐观并发(DocumentSession.Advanced .UseOptimisticConcurrency).获取下一个未处理的项目,然后立即将其已处理的标志更新为true.调用.SaveChanges你的会话 - >如果成功(你没有得到ConcurrencyException),你可以安全地返回作为请求结果的项目.如果没有,请加载下一个项目.