Java Infinispan:锁定远程事务缓存

Java Infinispan:锁定远程事务缓存,java,caching,infinispan,infinispan-9,Java,Caching,Infinispan,Infinispan 9,我们尝试使用infinispan作为带有读锁的远程缓存。客户端通过“put”进行读取以获得密钥锁,如在cache.put(k1,v1)时“悲观事务缓存”一节中的infinispan文档所述返回,k1已锁定,群集中任何位置运行的其他事务都无法写入。仍然可以读取k1。事务完成(提交或回滚)时,k1上的锁将被释放。 因此,情况是: transactionManager.begin(); // read with put to acquire write lock String value = getR

我们尝试使用infinispan作为带有读锁的远程缓存。客户端通过“put”进行读取以获得密钥锁,如在cache.put(k1,v1)时“悲观事务缓存”一节中的infinispan文档所述返回,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>
尽管客户端可以同时“读取并放入”一个值,但Concurent客户端在读取时放入值时不会出现异常,只是在稍后提交转换时才会出现异常。这是预期的行为吗?

是的,是的

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


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

那么在缓存配置中是什么意思?这是服务器的配置。这意味着服务器将使用悲观缓存重播热棒客户端事务,并检测与其他并发事务的任何冲突。恐怕链接已断开。
  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);