2012-07-16 53 views
3

我知道这篇文章的标题必须让一些人畏缩。自2011年12月以来我一直在使用RavenDB,并且我意识到我已经以不适合使用文档数据库的方式建模我的数据。首先,我完全明白这一点。其次,鉴于我目前的情况,我希望有一种方法可以使下面的方案正常工作。RavenDB引用完整性

场景:我想删除数据库中的某个Foo文档。但是,如果该文档正被另一个文档引用,我不想删除它。所以,我已经做到了这一点:

public void Delete(Foo foo) 
{ 
    VerifyFooNotUsedByBar(foo); // Make sure no bars reference this foo 

    VerifyFooNotUsedBySnuh(foo); // Make sure no snuhs reference this foo 

    // What happens if some other user causes this foo to be referenced 
    // by a bar, right now? 

    new GenericData().Delete(foo); 
} 

这个工作,但是...有一个机会,可以富别的东西可以参考,我做的检查他们。有没有办法在整个方法完成之前锁定其他更改?

我明白如果答案是:“不,你通过这种方式使用文档数据库来搞砸自己。”我只是希望能解决我目前的问题。

回答

2

鲍勃, 不是,没有。即使你有这个交易,它也不会锁定。 您可以做的是确保引用将保留在元数据中。 因此,当我引用Foo时,我需要更新Foo的元数据来告诉它我正在这样做。 这会导致事务真相的单点。