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