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

时间:2015-01-16 15:15:10

标签: hazelcast softlock

我遇到了在我的应用程序中集成Hazelcast(版本3.3)L2缓存的问题。以下是情景;

  • 第一种情况:使用CacheMode设置为Normal创建会话。 CacheConcurrencyStrategy是我想要缓存的实体的READ_WRITE。现在,我是第一次加载此实体,因此它将从数据库加载并将相同的内容放入缓存中。后来我用值将名称从'OldName'更新为'NewName'来更新实体。它正在将名称更新到数据库中,从L2中驱逐实体并将时间戳更新到L2缓存中,但是它没有将实体加载回L2中的最新值。问题是,在将数据更新到数据库后,会话是否应该将具有更新值的实体放回L2中?我在这里错过了一些配置吗?
  • 第二种场景:有两种不同的会话可以说S1和S2运行相同的配置(CacheMode设置为Normal)。 S1加载实体,将其放入L2并更新值(名称从'OldName'到'NewName')。它从L2中驱逐实体并尝试更新数据库中的值。但是在flush()和Commit()之间,第二个会话S2试图获取实体。因为S1已从L2中驱逐它并且已获取实体上的SoftLock,S2正在从数据库加载它,显然它将使用旧版本加载旧值(name =“OldName”),因为S1尚未提交到数据库。现在,当S1在数据库中提交新值(name =“NewName”)并在实体上释放SoftLock时,S2会将实体放入L2。这里的L2和数据库不同步,因为在数据库名称中,版本1为“NewName”,L2为版本0的“OldName”。
  • 第三种情况:继续第二种情况,如果S2或任何其他新会话尝试更新实体,那么会因版本不匹配而获得并发异常。

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

0 个答案:

没有答案