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

标签 java transactions firebase

简短版本:
在 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);
}

我知道由于 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/

相关文章:

java - 在 JDBC 中使用 postgres 锁定表

ios - Firebase查询WHERE

java - JDBC驱动程序不支持XA问题

javascript - angularFire 3 路数据绑定(bind)不会更新函数

swift - 如何从 Firebase 获取图像并将其显示为 ImageView ?

java - Applet 上未出现旋转的形状

java - 如果输入和输出数据库位于两个不同的数据库服务器中,是否可以使用渲染映射

java - 公历 GUI - 问题

java - 带有参数的自定义 Guice 绑定(bind)注释

hibernate - Grails 编程式事务处理