【问题标题】:Infinispan seems to be having phantom or dirty readsInfinispan 似乎有幻读或脏读
【发布时间】:2014-10-06 13:23:32
【问题描述】:

我正在使用 JBoss EAP 6.0.1.GA (AS 7.1.3.Final) 和捆绑的 Infinispan 'Brahma' 5.1.8.Final。我已将 Infinispan 配置为使用隔离级别 = SERIALIZABLE 的复制同步缓存,并在缓存上启用批处理。

我正在运行的示例代码:

Cache<String, List> cache = cacheContainer.getCache();
cache.startBatch();
List data = cache.get(key);
data.add(some value);
cache.put(key, data);
cache.endBatch(true);

编辑 尽我所能尝试,如果 2 个节点同时调用同一个块,则数据列表经常只包含来自一个节点的数据。看起来这是各种隔离级别的“*读取”问题,我认为我通过将隔离级别设置为可序列化来保证不会发生这种情况。 /编辑

我也尝试过使用 AdvancedCache,我的代码首先会这样做以尽可能早地获得事务锁:

// javadocs on this flag seem to indicate this is a good idea if doing a get-update-put
Cache<String, List> cache = cacheContainer.getCache();
AdvancedCache<String, List> advancedCache =
            cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK);  

我也尝试过设置事务模式(NON_XA / Pessimistic),但如果我实际上没有使用 big-T 事务(因为使用批处理),我认为这并不重要?并且更改交易模式我仍然偶尔会看到上述情况)。

是否有一些我遗漏或不正确的代码或配置?

【问题讨论】:

    标签: jboss7.x infinispan


    【解决方案1】:

    Infinispan 实际上并不支持 SERIALIZABLE 隔离级别,而是降级为 REPEATABLE_READ。

    但我认为您的测试的问题在于 Infinispan 不会对其存储的对象进行防御性副本 - 假设您将自己进行复制并将副本存储在缓存中。所以当你调用data.add(some value)时,你修改的是实际的缓存值而不是本地副本。

    您可以通过在缓存配置中启用storeAsBinary.storeValuesAsBinary 来更改该行为。

    【讨论】:

    • 感谢您的回复!关于 SERIALIZABLE 配置,你是对的,我在 Infinispan 用户指南中看到仅支持 READ_COMMITTED 和 REPEATABLE_READ,但 jboss-as-infinispan 模式允许 SERIALIZABLE。诡异的。我正在考虑尝试您对 storeValuesAsBinary 的建议,但用户指南说它可以从 v5.3 获得(javadoc 说 v5.2),我目前正在 v5.1.8 上进行测试。我已经考虑过升级,看看是否可以解决问题,所以我可以同时尝试:) 我稍微编辑了我原来的问题,希望能让我的问题更清楚。
    • 该选项也存在于 5.1.8 中,它只是在 5.2 中移动。但我还是建议升级到 5.2.x...
    • 我明白了!感谢您的解释。我已经升级到 6.0.2 并且正在使用这个配置值。
    【解决方案2】:

    答案是,Infinispan 5.x 版显然存在一个错误,即当它无法获取远程锁定时

    cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK)
    

    被调用。见https://issues.jboss.org/browse/ISPN-3266

    我升级到 6.0.2Final,现在它似乎可以正常工作,没有幻读/脏读。

    (感谢 JBoss 社区论坛上的 Wiliam 的回答和帮助!https://community.jboss.org/message/884303

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多