Hazelcast 读写缓存策略的并发更新和读取导致二级缓存中的数据不一致

Hazelcast 读写缓存策略的并发更新和读取导致二级缓存中的数据不一致,hazelcast,softlock,Hazelcast,Softlock,我在应用程序中集成Hazelcast(3.3版)二级缓存时面临问题。以下是场景 第一个场景:创建了一个将CacheMode设置为Normal的会话。CacheConcurrencyStrategy是我要缓存的实体的读写策略。现在,我第一次加载这个实体,所以它将从数据库中加载,并将其放入缓存中。稍后,我将使用从'OldName'到'NewName'的值let say name更新实体。它正在将名称更新到数据库中,将实体从二级缓存中逐出,并将时间戳更新到二级缓存中,但它没有使用二级缓存中的最新值加

我在应用程序中集成Hazelcast(3.3版)二级缓存时面临问题。以下是场景

  • 第一个场景:创建了一个将CacheMode设置为Normal的会话。CacheConcurrencyStrategy是我要缓存的实体的读写策略。现在,我第一次加载这个实体,所以它将从数据库中加载,并将其放入缓存中。稍后,我将使用从'OldName'到'NewName'的值let say name更新实体。它正在将名称更新到数据库中,将实体从二级缓存中逐出,并将时间戳更新到二级缓存中,但它没有使用二级缓存中的最新值加载实体。问题是会话不应该在将具有更新值的实体更新到数据库后将其放回L2吗?我是否缺少一些配置
  • 第二个场景:有两个不同的会话,比如S1和S2,它们使用相同的配置运行(CacheMode设置为Normal)。S1加载实体,将其放入L2并更新值(名称从'OldName'更新为'NewName')。它从L2中逐出实体,并尝试更新数据库中的值。但是在flush()和Commit()之间,第二个会话S2尝试获取实体。由于S1已将其从L2中逐出,并已获得实体上的软锁,S2正在从数据库加载它,显然它将加载旧版本的旧值(name=“OldName”),因为S1尚未提交到数据库中。现在,当S1在数据库中提交新值(name=“NewName”)并释放实体上的软锁时,S2将把实体放入L2。这里L2和数据库不同步,因为在数据库中,版本1的名称是“NewName”,而版本0的名称是“OldName”
  • 第三个场景:在第二个场景的延续中,如果S2或任何其他新会话尝试更新实体,这些会话将获得并发异常,因为存在版本不匹配

肯定有一些解决方案提供这些场景(因为这些是非常基本的场景),这是我无法找到的。请帮我解决这个问题。

我知道我的问题可能也隐藏在你的问题的某个地方,但它看起来像是夜惊。我宁愿忍受没有答案的人,也不愿忍受通读这篇文章。