我的数据库中有两个节点items
和my_items
。
我有一个执行multi-path update
的函数,这个函数从items
中删除一个项目,并将其添加到用户的my_items
中:
我保护my_items
节点的方式是,只有当items
中存在该项目时,您才可以写入它,否则它将失败:
private void getItem(String uid, String item_key) {
Map<String, Object> updates = new HashMap<>();
//delete item
updates.put("items/" + item_key, null);
//give the item to the user
updates.put("my_items/" + uid + "/" + item_key, itemObject);
mDatabaseReference.updateChildren(updates);
}
问题(理论上):
- 知道Firebase Database逐个处理请求。
如果用户A、B、C、D同时为同一个item id
调用getItem(..)
函数:
- 这是否合理:**
1.假设A的请求首先到达服务器,Succeeds
(now该项目已从items
中删除,并添加到位于my_items
的用户A)
- B:x1米12英寸1x
(因为items
中不再存在该项目,所以my_items
的安全规则阻止此操作) - C:x1米15英寸1x
(same原因)
1.直径:x1米16英寸1x
(same原因)
"* 这是真的吗,还是我弄错了**
谢谢。
2条答案
按热度按时间piv4azn71#
Firebase实时数据库按顺序处理(写入)操作。因此,在处理下一个操作之前,任何先前的写入操作都将完成。这意味着先前用户写入的任何数据都将出现在安全规则评估中的
root
变量中,以供后续写入操作使用。iklwldmw2#
本文讨论原子操作。RTDB在请求到达时执行操作。RTDB在事件到达时处理事件。还有一个问题可能与Does Firebase always guarantee added events in order?相关
您可以...在对两个位置进行单个原子更新时执行此操作:
JavaScript语言
java
目标-C
雨燕
深度路径更新使您可以编写更干净的代码,并轻松地对Firebase数据库中多个节点的数据进行非规范化处理。