Firebase java:在事务错误期间,我应该返回事务。中止()vs事务。成功(…)?
短版本:
在Firebase事务(Java)中,如果我从MutableData.getValue()
获得意外或不一致(过时)的值,我应该如何检查错误并确保事务在必要时重复运行?我什么时候使用Transaction.abort()
vsTransaction.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);
}
我知道data.getValue()
可能会返回过时的值(包括null
),因为Firebase的最终一致性,因此事务可能需要执行多次。但是,如果在if
语句中返回Transaction.abort()
,则事务似乎只运行一次。如果我用Transaction.success(data)
替换它,我不是在提交错误的值吗?如何检测该值何时实际为null或不是“foo”
# 1 楼答案
(自行回答;必要时请更正!)
通过实验,我发现如果希望事务再次运行,我需要使用
Transaction.success(...)
Transaction.abort()
总是阻止Firebase重试,因此我应该只在确信事务无法继续时才使用它。(例如,如果data.getValue()
指示数据位置的某些内容已关闭,并且不会通过任何挂起的写入进行更正。)在我的示例中,data.getValue() == null
对于abort()
来说似乎是一个特别糟糕的情况,因为可能有新的值在前面的写入中挂起如果我在错误情况下返回
Transaction.success(data)
,Firebase将确保最终实现一致性。e、 g.我不会意外地将null
写入该位置,除非data.getValue()
给出的值确实丢失我可以在
Transaction.Handler.onComplete(...)
方法中执行所有错误检查,该方法有一个DataSnapshot
参数来检查该位置的最终数据