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并在您自己的线程池中执行更简单的了。并使用同步缓存