当前位置: 首页 > 知识库问答 >
问题:

Infinispan:锁定远程事务缓存

养研
2023-03-14

我们尝试使用infinispan作为带有读锁的远程缓存。客户通过“put”进行读取,以获得钥匙锁,正如悲观事务缓存“When 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>

客户端正在使用以下配置作为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);

尽管客户端可以同时“读取并放入”一个值,但并发客户端在读取时放入值时不会出现异常,而只是在稍后提交转换时才会出现异常。这是预期的巴哈维奥吗?

共有1个答案

蔚承天
2023-03-14

是的,它是。

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

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

 类似资料:
  • 我们使用Infinispan 4.0作为缓存提供程序(我知道它有点过时,因为第9版是最新的)。尽管如此,在阅读文件时,我有点困惑,其中指出: 默认情况下,Infinispan会延迟获取远程锁。锁是在运行事务的节点上本地获取的,而其他集群节点会在两阶段准备/提交阶段尝试锁定事务中涉及的缓存密钥。但是,如果需要,Infinispan可以显式或隐式地急切地锁定缓存密钥。 英菲尼斯潘的默认行为是什么?我知

  • 我是infinispan的新手,通过实验学习。在尝试访问不同名称的远程缓存失败后,我需要一些帮助。下面是我的infinispan客户端-服务器模式未嵌入的场景。 1) 我在infinispan集群中启动了node1,并将默认远程缓存名称设置为node1\u cache--Hotrod服务器已启动 2) 已在infinispan群集中启动node2,并将默认远程缓存名称设置为node2\u cach

  • 我必须使用分布式缓存,我想使用Infinispan 5.3。我检查了不同的连接模式,并选择了hot rod来实现客户机-服务器通信。我还需要在缓存中锁定特定密钥,然后在处理后解锁它(锁定和解锁的位置在我的应用程序中的不同类中…)。 我阅读了很多关于这个问题的文档、文章和论坛条目,但到目前为止我还没有找到任何解决方案。如果我正确解释了我读到的内容,那么就不可能在hot rod中手动锁定钥匙。我试图手

  • Infinispan作为hibernate二级缓存的更新方式与数据库事务的工作方式不同。我的意思是,在完全提交之前,数据库事务对其他事务不可见。根据日志记录,我观察到事务(JEE MDB)能够部分更新给定的Infinispan更新。具体来说,我的设置如下: Jboss 我似乎看到的是,如果在事务的DB提交之后启动JEE bean,并且我认为是infinispan更新(提交),那么它可以看到一些in

  • 尊敬的Infinispan社区 我在EAP和Spring部署中运行应用程序。将依赖项从EAP 7.1迁移到EAP 7.2后,我在spring模式下收到警告:

  • 我使用JBoss作为7.1.1最终版本。我已经配置了事务模式为“FULL_XA”的复制缓存。 我使用缓存作为内存数据库。缓存中的条目由应用程序操作(添加/更新/删除)。我面临的场景是,JTA事务回滚不会恢复缓存中先前添加的条目。Infinispan文档指定了要为缓存配置的事务管理器。我相信在JBoss应用服务器上,infinispan应该能够自动选择正确的事务管理器。此外,infinispan 1