2014-09-29 19 views
2

短版
在火力地堡交易(在Java中),如果我从MutableData.getValue()得到意外的或不一致的(过时)值,应该怎么错误检查并确保该交易如果有必要重复运行?我何时使用Transaction.abort() vs Transaction.success()Firebase java:在交易错误期间,我应该返回Transaction.abort()vs Transaction.success(...)吗?

长版
我想用Java写了一个火力地堡交易是

  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),因此该交易可能需要多次执行。但是,如果我在if声明中返回Transaction.abort(),似乎该交易只运行一次。如果我用Transaction.success(data)替换它,我会不会承诺错误的价值?如何检测值何时实际为空或“富”?

回答

2

(自答案;!正确的,如果必要的话)

通过实验,我发现我需要使用Transaction.success(...)如果我想交易到以后再运行。 Transaction.abort()总是会阻止Firebase再次尝试,因此我只能在确定交易无法继续时才使用它。 (例如,如果data.getValue()指示数据位置有某些内容不存在,并且它将不会被任何未完成的写入纠正)。在我的示例中,data.getValue() == null对于abort()来说似乎是特别糟糕的情况,因为可能有更早的写。

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

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

+1

这看起来大致正确。当设置的操作不再适用时(即数据中的某个值以不再适合的方式更改),应使用Transaction.abort()。在其他所有情况下,.success()是合适的选择。正如你发现的,onComplete()是完成所有应该只运行一次的成功工作的正确地点。 – Kato 2014-09-30 02:51:02

+0

@Kato有什么特别的错,或者只是措辞或什么? (只是想了解更多:]) – 2014-09-30 07:19:35