简短版本:
在 Firebase 事务(Java 中)中,如果我从 MutableData.getValue()
获得意外或不一致(过时)的值,我应该如何进行错误检查并确保事务在必要时重复运行?什么时候使用 Transaction.abort()
和 Transaction.success()
?
长版:
我想用 Java 编写一个 Firebase 事务,
检查值“foo”是否存储在某个位置,如果不同或丢失则记录错误,然后
将值更新为“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);
}
我知道由于 Firebase 的最终一致性,data.getValue()
可能会返回过时的值(包括 null
),因此事务可能需要执行多次。但如果我在 if
语句中返回 Transaction.abort()
,事务似乎只会运行一次。如果我用 Transaction.success(data)
替换它,我不会提交错误的值吗?如何检测值何时实际上为空或不是“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/