Infinispan:锁定远程事务缓存

Infinispan : locking in remote transactional cache

我们尝试使用 infinispan 作为带有读锁的远程缓存。客户端正在使用 "put" 进行读取以获取密钥锁,如 悲观事务缓存 部分中描述的 infinispan 文档“当 cache.put (k1,v1) returns, 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>

并且客户端作为 HOTROD 客户端访问 remoteCacheManager,配置为:

  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);

尽管客户端可以同时 "read with put" 一个值,但 Concurent 客户端在读取值时不会出现异常,但只会在稍后提交交易时出现异常。这是预期的行为吗?

是的,是的。

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

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