在Firebase中执行多位置更新时,如何使用事务?

在Firebase中执行多位置更新时,如何使用事务?,firebase,firebase-realtime-database,Firebase,Firebase Realtime Database,在我的Firebase数据库中,我需要两次同时写入两个位置。我对这两个位置都有规则,可以确保用户在没有同时向另一个位置写入数据的情况下无法在那里写入数据 对其中一个位置的写入需要递增/递减。当然,这必须通过事务来完成,否则我不能保证用户不会覆盖其他用户对同一节点的同时递增/递减更新 问题是,我找不到任何关于将多位置更新与事务相结合的文档。这是不可能做到的吗?否。事务在单个节点上运行 这意味着,如果您想要运行多位置事务,则必须在树中的“最低级别共享节点”上运行该事务。这绝不是一个好主意 另一种方法

在我的Firebase数据库中,我需要两次同时写入两个位置。我对这两个位置都有规则,可以确保用户在没有同时向另一个位置写入数据的情况下无法在那里写入数据

对其中一个位置的写入需要递增/递减。当然,这必须通过事务来完成,否则我不能保证用户不会覆盖其他用户对同一节点的同时递增/递减更新


问题是,我找不到任何关于将多位置更新与事务相结合的文档。这是不可能做到的吗?

否。事务在单个节点上运行

这意味着,如果您想要运行多位置事务,则必须在树中的“最低级别共享节点”上运行该事务。这绝不是一个好主意


另一种方法是使用服务器端安全规则保护多位置写入。有关此操作的示例,请参阅,它基本上使用安全规则构建比较和设置操作。

现在可以通过引入
ServerValue.increment()

例如:

Map postLikeUpdate=newhashmap();
postLikeUpdate.put(“postLikedBy/”+postId+“/”+userId,true);
postLikeUpdate.put(“likecount/”+postId,ServerValue.increment(1));
FirebaseDatabase.getInstance().getReference().updateChildren(postLikeUpdate);

为什么最低节点上的事务“从来都不是一个好主意”?因为这个问题是关于用一个调用更新多个位置,这意味着JSON树中的“最低级别共享节点”可能比单个实体的更高。这意味着存在更多的资源争用机会,这降低了事务的可伸缩性。谢谢你的回复。这是有道理的。如果需要递增的值是字符串类型,该怎么办?ServerValue.increment()方法不适用于这种情况。是否有其他方法?是否尝试递增保存为字符串的整数?如果是,我建议您将其存储为整数而不是字符串。这会让你的工作轻松很多。是的,我的问题就是这样。问题是该值以前已作为字符串存储在数据库中。现在,我需要更新数据库,但这确实很麻烦。我认为最好对字符串字段使用普通事务,并在字符串更新时编写一个云函数来更新整数字段。另外,使用多路径更新更新新更新中的整数字段。稍后,可以完全淘汰字符串字段。