【问题标题】:Infinispan : locking in remote transactional cacheInfinispan:锁定远程事务缓存
【发布时间】:2019-03-04 05:05:15
【问题描述】:

我们尝试使用 infinispan 作为带有读锁的远程缓存。客户端正在使用“put”进行读取以获取密钥锁定,如 悲观事务缓存部分中描述的 infinispan 文档“当 cache.put(k1,v1) 返回时, k1 被锁定,集群中任何地方运行的其他事务都不能写入它。读取 k1 仍然是可能的。当事务完成(提交或回滚)时,k1 上的锁被释放。 所以场景:

transactionManager.begin();
// read with put to acquire write lock
String value = getRemoteCache().get(key);
getRemoteCache().put(key, value);

// do smthing with the value

getRemoteCache().put(key, newValue);
transactionManager.commit();

远程缓存配置为带有悲观锁定的事务性:

   <local-cache name="default"> <locking isolation="REPEATABLE_READ" acquire-timeout="30000" concurrency-level="1000" striping="false"/>
        <transaction  mode="NON_XA" locking="PESSIMISTIC"/>
   </local-cache>

并且客户端正在使用配置访问 remoteCacheManager 作为 HOTROD 客户端:

  ConfigurationBuilder builder = new ConfigurationBuilder();
    // add more configurations ?
    builder.transaction().transactionManagerLookup(GenericTransactionManagerLookup.getInstance());
    builder.transaction().transactionMode(TransactionMode.NON_XA);
    builder.addServer().host(readServerHostConfiguration()).port(readServerPortConfiguration());
    return new RemoteCacheManager(builder.build(), true);

尽管客户端可以同时“使用 put 读取”一个值,但 Concurent 客户端在读取该值时并没有收到异常,而是稍后通过提交事务。这是预期的行为吗?

【问题讨论】:

    标签: java caching infinispan infinispan-9


    【解决方案1】:

    是的。

    如文档 (Hot Rod Transaction) 中所述,客户端上运行的事务具有乐观语义。只有在提交期间才会获取锁。

    悲观锁定事务仅在嵌入式模式下有效。

    【讨论】:

    • 那么缓存配置中的是什么意思?
    • 这是服务器的配置。这意味着服务器将使用悲观缓存来重放 Hot Rod 客户端事务并检测与其他并发事务的任何冲突。
    • 恐怕链接坏了。
    猜你喜欢
    • 2017-12-31
    • 2014-05-10
    • 2014-02-25
    • 2015-06-14
    • 2013-09-07
    • 2020-02-22
    • 2014-07-15
    • 2013-10-31
    • 2012-09-07
    相关资源
    最近更新 更多