【问题标题】:Firebase: How to push in transaction?Firebase:如何推送交易?
【发布时间】:2013-01-31 11:23:22
【问题描述】:

假设我有以下结构:

{
  "-InSwU2yHOEHwhP_m4_n" : {
    ".priority" : 0.0,
    "name" : "abc"
  },
  "-InSw_P0j8A-0Njj0Uvf" : {
    ".priority" : 1.0,
    "name" : "def"
  }
}

我想添加另一个类似的项目,其中 guid 作为键,优先级等于当前显示的项目数(在本例中为 2)。结果应如下所示:

{
  "-InSwU2yHOEHwhP_m4_n" : {
    ".priority" : 0.0,
    "name" : "abc"
  },
  "-InSw_P0j8A-0Njj0Uvf" : {
    ".priority" : 1.0,
    "name" : "def"
  },
  "-InSxV-RVkZ07_f3uDnJ" : {
    ".priority" : 2.0,
    "name" : "ghi"
  }
}

请注意,由于多个客户端可能同时尝试添加此类项目,因此这必须是一个事务。

有什么想法吗?

【问题讨论】:

    标签: firebase


    【解决方案1】:

    当您使用push() 时,会为每个项目分配一个唯一的 ID。所以不需要交易(不会有冲突)。

    如果您希望记录在优先级上是唯一的(这看起来就像您要完成的工作),我认为您应该简单地使用优先级作为 ID。

    然后你可以使用事务来确保两个客户端不会同时推送:

    FB.child(path).transaction(function(current_val) {
       if( current_val === null ) {
          /* set the value here */
       }
       /* do nothing; transaction fails because it was already written */
    }, function(success) {
       /* transaction done */
    });
    

    但是,如果您将优先级用作唯一 ID,则可能需要重新考虑;这确实是 ID 的工作,而且做得很好;记录也按照插入的顺序进行维护,因此在大多数情况下不需要计数器。

    【讨论】:

    • 谢谢加藤!我还应该注意,如果您使用 push(),项目将按照添加的顺序显示(只要它们是从同一个客户端推送的。其他客户端可能有歪斜的时钟,我们试图补偿,但并不总是 100% 成功)。
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多