Firebase实时数据库“全有或全无”事务

7

有没有一种方法可以在RTDB的“transactions” API中进行“批量”写操作?(我们目前无法迁移到Firestore)
我们的问题如下:
当将新的“Job”对象写入服务器时,我们执行了三个连续的写操作:

  1. 使用GeoFire API编写位置键
  2. 编写工作
  3. 连接创建它的用户的Job ID

不幸的是,如果一个写操作失败但之前的一个写操作成功,它会导致系统出现严重错误。
我们正在寻找保证完成度或在写操作失败时撤销操作的方法。

2个回答

6
如果只涉及到“写入”和“确保完整性,如果写入操作失败则还原操作”,您可以使用update()方法进行“同时更新”。根据文档的详细说明,“同时更新……是原子性的:要么所有更新成功,要么所有更新失败。”请参阅文档的这一部分:https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields 请注意,实时数据库还提供将数据保存为事务的可能性,请参阅文档项此处此处。但在您的情况下,使用同时更新可能就足够了。

5

这里是我代码的一部分,仅供以后参考。(使用了Renaud的答案)

private void pushJob(Person person) {
        DatabaseReference dataBase = FirebaseDatabase.getInstance().getReference();

        GeoHash geoHash = new GeoHash(new GeoLocation(choosenLatLng.latitude,choosenLatLng.longitude));
        Map<String, Object> geofireData = new HashMap<>();
        geofireData.put("g", geoHash.getGeoHashString());
        geofireData.put("l", Arrays.asList(choosenLatLng.latitude,choosenLatLng.longitude));


        Map<String, Object> childUpdates = new HashMap<>();
        childUpdates.put("/Geofire/" + job.getmJobUid(), geofireData);
        childUpdates.put("/Jobs/" + job.getmJobUid(), job);
        childUpdates.put("/Users/" + job.getPersonUid(), person);

        dataBase.updateChildren(childUpdates).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                progressDialog.dismiss();
                updateUI();
            }
        });
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接