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

DsC*_*Cpp 6 transactions firebase firebase-realtime-database

有没有办法在 RTDB 中操作事务 API 以进行“批量”写入?(我们目前无法迁移到 Firestore)
我们的问题如下:
当向服务器写入新的“作业”对象时,我们正在执行三个连续的写道:

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

不幸的是,如果其中一个写入失败但前一个写入成功,则会导致系统出现重大错误。
我们正在寻找确保完整性的方法,或者在其中一个写入失败时恢复操作。

Ren*_*nec 7

如果只是写入的问题并且“确保完整性,或者在其中一个写入失败时恢复操作”,则可以通过使用该方法来使用同步更新update()

正如文档中所详述的,“同时更新......是原子的:要么所有更新成功,要么所有更新失败。”。请参阅文档的这一部分:https ://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

请注意,实时数据库还提供了将数据保存为事务的可能性,请参阅此处此处的文档项目。但就您的情况而言,使用同步更新可能就足够了。


DsC*_*Cpp 5

这是我的代码片段,仅供将来参考。(使用雷诺的回答)

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();
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)