【问题标题】:Strict vs NonStrict NHibernate cache concurrency strategiesStrict vs NonStrict NHibernate 缓存并发策略
【发布时间】:2010-09-11 16:07:01
【问题描述】:

本题是关于NHibernate二级缓存的ReadWrite和NonStrictReadWrite缓存并发策略的区别。

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

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

【问题讨论】:

    标签: nhibernate caching


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢尼克,这很有帮助。我错误地认为时间戳缓存可以防止脏读,但我可以看到如果不锁定缓存是不可能的(nonstrict 不会这样做)。
    【解决方案2】:

    我创建了一个帖子here 解释这些差异。请查看并随时发表评论。

    【讨论】:

      猜你喜欢
      • 2010-10-06
      • 1970-01-01
      • 2012-09-05
      • 2020-08-03
      • 2011-11-12
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多