这个问题是关于NHibernate的二级缓存的ReadWrite和NonStrictReadWrite缓存并发策略之间的区别。

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

我不理解的部分是当你有一个缓存或分布式分区(非复制)缓存时,严格与非严格区分是如何相关的。它有用吗?在我看来,在非复制方案中,时间戳缓存将确保不提供过时结果。如果它可能相关,我想看一个例子。

有帮助吗?

解决方案

您认为是正确的,在单个目标/线程环境中没有什么区别。但是,如果您查看缓存提供程序,即使在多线程方案中也会有一些进展。

如何从一个对象重新缓存它的修改状态在非严格中是不同的。例如,如果您的对象要重新加载更加强大,但是您希望在更新后使用该对象而不是使用该帐单支持下一个用户,那么您将看到严格与非严格的不同性能。例如:非严格只是在执行更新后从缓存中转储对象...为下次访问时的获取而不是更新后事件处理程序支付价格。在严格模型中,重新缓存会自动处理。插入时会发生类似的事情,非严格将不会执行任何操作,其中strict将落后并将新插入的对象加载到缓存中。

在非严格的情况下,您也有可能出现脏读,因为在读取时未锁定缓存,您将看不到另一个线程对项目的更改结果。严格来说,该项目的缓存键会锁定,您将被阻止,但会看到绝对最新结果。

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

当执行保存并加载编辑屏幕时,这当然会成为一个问题:认为他们正在编辑对象的最新版本的人确实不是,并且他们在他们遇到令人讨厌的惊喜时尝试将编辑内容保存到他们加载的陈旧数据中。

其他提示

我已创建帖子此处解释差异。请看一下并随意发表评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top