根据Apache ignite
春季数据文档,有两种方法将数据保存在ignite
缓存中:
1. org.apache.ignite.springdata.repository.IgniteRepository.save(key, vlaue)
和
2. org.apache.ignite.springdata.repository.IgniteRepository.save(Map<ID, S> entities)
所以,我只想了解第二种方法的事务行为。假设我们将使用save(Map<Id,S>)
方法保存100条记录,由于某种原因,在70条记录之后,某些节点将关闭。在这种情况下,它会回滚所有70条记录吗?
注意:按照第一种方法的行为,如果我们在方法级别使用@Transaction
,则它将回滚特定实体。
答案 0 :(得分:2)
首先,您应该了解Apache Ignite中使用的事务处理机制。此处介绍的文章对此进行了很好的描述:
https://apacheignite.readme.io/v1.0/docs/transactions#section-two-phase-commit-2pc
对您而言最有趣的部分是“备份节点故障”和“主节点故障”:
备份节点故障
如果备份节点在“准备”阶段或“提交”阶段失败,则不需要特殊处理。数据仍将提交到活动的节点上。然后,GridGain将在后台指定一个新的备份节点,并且数据将被复制到事务范围之外。
主节点故障
如果主节点在“准备”阶段之前或期间发生故障,则协调器将指定一个备份节点成为主节点,然后重试“准备”阶段。如果故障发生在“提交”阶段之前或期间,则备用节点将检测到崩溃并向协调器节点发送消息,以查找是提交还是回滚。事务仍然完成,并且分布式缓存中的数据保持一致。
对于您而言,映射中所有值的所有更新应在一次事务中完成或回滚。我想这些文章回答了您的问题。