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

时间:2020-03-06 14:29:30  来源:igfitidea点击:

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

据我了解,当我们具有分布式复制缓存时,这两种策略之间的区别非常重要,即不能严格保证一个缓存与另一个缓存具有完全相同的值,而严格的读/写操作应假定缓存提供者做了适当的设置分布式锁定。

我不了解的部分是,当我们拥有单个缓存或者分布式分区(非复制)缓存时,严格与非严格区分是如何相关的。有关系吗?在我看来,在非复制方案中,时间戳缓存将确保不提供过时的结果。如果可以的话,我想看个例子。

解决方案

我们假设是正确的,在单个目标/线程环境中几乎没有什么区别。但是,如果我们查看高速缓存提供程序,即使在多线程方案中也要进行一些操作。

从对象的修改状态重新缓存对象的方式在非严格方面有所不同。例如,如果对象要重装得多,但是我们希望它在更新后而不是让下一个用户付账,那么严格和不严格的性能就会有所不同。例如:non-strict只是在执行更新后从高速缓存中转储对象...为下一次访问的获取支付价格,而不是更新后的事件处理程序。在严格模型中,重新缓存是自动进行的。插入也会发生类似的情况,非严格将不执行任何操作,而严格将落后于此并将新插入的对象加载到缓存中。

在非严格情况下,我们还可能会进行脏读取,因为在读取时未锁定高速缓存,因此我们不会看到另一个线程对该项目进行更改的结果。严格来说,该项目的缓存键将锁定,我们将被阻止,但绝对可以看到最新结果。

因此,即使在单个目标环境中,如果对对象进行大量的并发读取/编辑,那么我们就有机会查看不太准确的数据。

当执行保存并加载编辑屏幕时,这当然成为一个问题:认为自己正在编辑对象的最新版本的人确实没有,并且当他们尝试保存时会感到讨厌他们加载的过时数据的编辑。