Asynchronous infinispan缓存中异步事务的行为是什么?

Asynchronous infinispan缓存中异步事务的行为是什么?,asynchronous,transactions,infinispan,Asynchronous,Transactions,Infinispan,为了提高性能,我正在研究异步事务 您能解释一下复制异步缓存中事务的行为吗 如果我有一个由操作组成的事务,其中每个操作都取决于前一个操作(即操作的执行顺序很重要) 例如,考虑一个事务T,它执行构建DATA2所需的DATA1的读取,然后在Cache上写入DATA2。 交易记录T{ // 1° operation data1 = get(key1); // 2° operation data2 = elaborate(data1); // 3°

为了提高性能,我正在研究异步事务

您能解释一下复制异步缓存中事务的行为吗

如果我有一个由操作组成的事务,其中每个操作都取决于前一个操作(即操作的执行顺序很重要)

例如,考虑一个事务T,它执行构建DATA2所需的DATA1的读取,然后在Cache上写入DATA2。 交易记录T{

    // 1° operation

    data1 = get(key1);



    // 2° operation

    data2 = elaborate(data1);



    // 3° operation

    put(data2);
}

换句话说,我需要异步执行“整个事务”,但我需要在事务内部执行的操作保持同步

可能吗?如果是,我必须如何配置infinispan

非常感谢


Francesco Sclano

我想您已经将这些操作包装到
tm.begin()中了;请尝试{…tm.commit();}catch(…){tm.rollback();}
。 其他选项很少,因此,我假设您使用默认乐观事务和两阶段提交。我还建议启用写倾斜检查-这应该是Infinispan 7中的默认设置,但在以前的版本中,您必须显式启用它,没有它,有些操作的行为会很奇怪

至于
get
,这始终是同步的-您必须等待响应。 在
commit
之前,
put
基本上只执行另一个
get
(以返回值)并记录事务应在提交期间执行写入操作

然后,在提交期间,锁定所有更新项的
PrepareCommand
异步发送-因此,您无法知道它是否成功或失败(通常是由于超时,但也由于写入倾斜检查或条件命令中的值更改)

第二阶段,覆盖条目并解锁锁的
CommitCommand
在此之后同步发送,因此您需要等待收到响应。但是,如果您有
(默认),即使此命令在某个地方失败,提交也会成功。 为了异步发送
CommitCommand
(或
rollback命令
),您需要配置

我希望我已经正确地解释了这些来源——不要问我为什么要这样做。遗憾的是,我不确定您是否可以立即配置语义“提交或回滚此事务,但不报告结果并让我继续”。

编辑:异步模式下的提交应为1阶段,因为您无论如何都无法检查结果。因此,并发写入可能会在不同的节点上重新排序,从而导致集群不一致,但您不会等待事务完成

无论如何,如果您想以原子和异步方式执行整个块,没有什么比将代码包装成Runnable并在您自己的线程池中执行更简单的了。并使用同步缓存