gpt4 book ai didi

java - Firebase java : during transaction errors, 我应该返回 Transaction.abort() 还是 Transaction.success(...)?

转载 作者:行者123 更新时间:2023-11-30 08:20:24 26 4
gpt4 key购买 nike

精简版:
在 Firebase 事务(在 Java 中)中,如果我从 MutableData.getValue() 中得到意外的或不一致的(陈旧的)值,我应该如何进行错误检查并确保事务在必要时重复运行?何时使用 Transaction.abort()Transaction.success()

长版:
我想用 Java 编写一个 Firebase 事务

  1. 检查值“foo”是否存储在某个位置,如果不同或丢失则记录错误,然后

  2. 将值更新为“bar”。

我们希望“foo”位于该位置,因为它在事务运行之前已由同一客户端成功写入。

考虑以下几点:

public Transaction.Result doTransaction(MutableData data) {
String value = (String) data.getValue();
if(value == null || !Transaction.equals("foo")) {
return Transaction.abort();
}
data.setValue("bar");
return Transaction.success(data);
}

我知道 data.getValue() 可能返回陈旧的值(包括 null),因为 Firebase 的最终一致性,所以事务可能需要执行多次.但是,如果我在 if 语句中返回 Transaction.abort() ,事务似乎只运行一次。如果我用 Transaction.success(data) 替换它,我不会提交错误的值吗?如何检测值何时实际为 null 或不是“foo”?

最佳答案

( self 回答;必要时更正!)

通过试验,我发现如果我希望事务再次运行,我需要使用 Transaction.success(...)Transaction.abort() 总是会阻止 Firebase 再次尝试,所以我应该只在确定交易无法继续时才使用它。 (例如,如果 data.getValue() 表示数据位置有问题,并且不会被任何挂起的写入纠正。)在我的示例中,data.getValue() = = null 对于 abort() 来说似乎是一个特别糟糕的情况,因为之前的写入可能有新的值待处理。

如果我在错误情况下返回 Transaction.success(data),Firebase 将确保一致性最终得到解决。例如我不会意外地将 null 写入那个位置,除非 data.getValue() 给出的值真的丢失了。

我可以在 Transaction.Handler.onComplete(...) 方法中进行所有错误检查,该方法有一个 DataSnapshot 参数来检查最终数据位置。

关于java - Firebase java : during transaction errors, 我应该返回 Transaction.abort() 还是 Transaction.success(...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com