实时数据库Firebase“全有或全无”交易

时间:2018-05-21 07:52:39

标签: firebase firebase-realtime-database transactions

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

  1. 使用GeoFire API
  2. 编写位置键
  3. 写作业
  4. 将作业ID连接到创建它的用户
  5. 不幸的是,如果其中一个写入失败但前一个写入成功,则会导致系统出现重大错误 我们正在寻找确保完整性的方法,或者在其中一个写入失败时恢复操作。

2 个答案:

答案 0 :(得分:2)

如果仅仅是和"确保完整性,或者如果其中一个写入失败而恢复操作",您可以使用同步更新使用update()方法。

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

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

答案 1 :(得分:1)

以下是我的代码中的代码段,仅供将来参考。 (使用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();
            }
        });
    }