2012-01-02 76 views
2

我有以下问题,我正在使用RavenDB在无状态REST服务器中实现队列抽象。如何在RavenDB中实现原子并发读取文档?

假设我有2 REST调用A和B

当调用一个正在发生的事情我查询了最后一个项目(项目一)队列,并给它打电话A.

如果呼叫B称为在呼叫A的同时 - 这可能发生在REST呼叫中,因此我需要防止程序给予呼叫B与A相同的项目,这意味着呼叫A应该“锁定”项目A.

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

P.S我用Nancy为REST服务器

回答

5

这不应该太硬,除非我错过了一些东西:你的项目,例如

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

+0

是否有这样的情况,即两个调用在同一时间完全更新并且不会引发异常?我想这取决于它是如何在RavenDB内实现的 – 2012-01-03 07:00:15

+1

不,这是不可能的。您对SaveChanges调用之间文档的所有更改都是完全事务性的,这意味着全部或者没有成功。在Session上启用OptimisticConcurrency可以保证没有其他人修改过文档。 (顺便说一句:RavenDB甚至支持System.Transaction,这样你就可以跨越更长的事务,但这对你的情况没有任何意义,就像信息一样)。 – 2012-01-03 13:22:07

+0

@DanielLang嗨丹尼尔,你的回答非常有帮助。只是想通过在'Processed'之类的单个字段上使用UseOptimisticConcurrency来问,它能保证访问RavenDB集群的许多客户端(在分布式环境中)的原子性?或者我需要一个明确的'交易'?非常感谢。 – Dodd 2012-03-16 07:54:21