首页 > 解决方案 > Apache用map参数点燃spring数据保存方法事务行为

问题描述

根据 apache ignitespring data 文档,有两种方法可以将数据保存在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在方法级别使用,那么它将回滚特定实体。

标签: ignite

解决方案


首先,您应该阅读 Apache Ignite 中使用的事务机制。此处介绍的文章对此进行了很好的描述:

https://apacheignite.readme.io/v1.0/docs/transactions#section-two-phase-commit-2pc

对您来说最有趣的部分是“备份节点故障”和“主节点故障”:

备份节点故障

如果备份节点在“准备”阶段或“提交”阶段失败,则不需要特殊处理。数据仍将在活动的节点上提交。然后,GridGain 将在后台指定一个新的备份节点,并将数据复制到事务范围之外。

主节点故障

如果主节点在“准备”阶段之前或期间发生故障,则协调器将指定其中一个备份节点成为主节点并重试“准备”阶段。如果故障发生在“提交”阶段之前或期间,则备份节点将检测到崩溃并向协调器节点发送消息以判断是提交还是回滚。事务仍然完成,分布式缓存中的数据保持一致。

在您的情况下,地图中所有值的所有更新都应该在一个事务中完成或回滚。我想这些文章回答了你的问题。


推荐阅读