有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Firebase java:在事务错误期间,我应该返回事务。中止()vs事务。成功(…)?

短版本
在Firebase事务(Java)中,如果我从MutableData.getValue()获得意外或不一致(过时)的值,我应该如何检查错误并确保事务在必要时重复运行?我什么时候使用Transaction.abort()vsTransaction.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”


共 (1) 个答案

  1. # 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参数来检查该位置的最终数据