严格与非严格NHibernate缓存并发策略

严格与非严格NHibernate缓存并发策略,nhibernate,caching,Nhibernate,Caching,这个问题是关于NHibernate二级缓存的读写和非写缓存并发策略之间的区别 据我所知,当您拥有分布式复制缓存时,这两种策略之间的差异是相关的-非严格不会保证一个缓存与另一个缓存具有完全相同的值,而严格的读/写应该-假设缓存提供程序执行适当的分布式锁定 我不明白的是,当您使用单个缓存或分布式分区(非复制)缓存时,严格与非严格的区别是如何相关的。这有关系吗?在我看来,在非复制场景中,时间戳缓存将确保不提供过时的结果。如果相关的话,我想看一个例子。您的假设是正确的,在单个目标/线程环境中几乎没有区别

这个问题是关于NHibernate二级缓存的读写和非写缓存并发策略之间的区别

据我所知,当您拥有分布式复制缓存时,这两种策略之间的差异是相关的-非严格不会保证一个缓存与另一个缓存具有完全相同的值,而严格的读/写应该-假设缓存提供程序执行适当的分布式锁定


我不明白的是,当您使用单个缓存或分布式分区(非复制)缓存时,严格与非严格的区别是如何相关的。这有关系吗?在我看来,在非复制场景中,时间戳缓存将确保不提供过时的结果。如果相关的话,我想看一个例子。

您的假设是正确的,在单个目标/线程环境中几乎没有区别。但是,如果您查看缓存提供程序,即使在多线程场景中也会出现一些问题

对象如何从其修改状态重新缓存在非严格模式中是不同的。例如,如果要重新加载的对象要大得多,但您希望它在更新后重新加载,而不是让下一个用户付账,那么您将看到严格与非严格的性能有所不同。例如:执行更新后,non-strict会简单地从缓存转储一个对象……在下次访问时为获取支付价格,而不是更新后事件处理程序。在严格模型中,重新缓存是自动处理的。插入时也会发生类似的情况,如果strict返回并将新插入的对象加载到缓存中,则non strict不会执行任何操作

在非严格的情况下,您还可能会进行脏读,因为在读取时缓存未锁定,因此您将看不到另一个线程对该项进行更改的结果。严格来说,该项的缓存密钥将被锁定,您将被挂起,但会看到绝对最新的结果

因此,即使在单个目标环境中,如果对象上存在大量并发读取/编辑,那么您也有机会看到不太准确的数据


当执行保存并加载编辑屏幕时,这当然会成为一个问题:认为他们正在编辑对象的最新版本的人实际上不是,当他们试图保存对加载的陈旧数据的编辑时,他们会感到非常惊讶。

我已经创建了一篇文章来解释这些差异。请查看并发表评论。

谢谢Nick,这非常有帮助。我错误地认为时间戳缓存会阻止脏读,但我可以看出,如果不锁定缓存(非严格缓存不会做到这一点),这是不可能的。