【问题标题】:Realtime Database Firebase "All or nothing" transactions实时数据库 Firebase “全有或全无”事务
【发布时间】:2022-03-17 13:33:46
【问题描述】:
有没有办法在 RTDB 中为“批量”写入操作事务 API?(我们目前无法迁移到 Firestore)
我们的问题如下:
当向服务器写入一个新的“Job”对象时,我们会执行三个连续写入:
- 使用GeoFire API 写入位置键
- 写作业
- 将作业 ID 连接到创建它的用户
不幸的是,如果其中一个写入失败但前一个写入成功,则会导致系统出现重大错误。
我们正在寻找确保完整性的方法,或者在其中一个写入失败时恢复操作。
【问题讨论】:
标签:
firebase
firebase-realtime-database
transactions
【解决方案2】:
这是我的代码中的一个 sn-p,仅供将来参考。 (使用雷诺的答案)
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();
}
});
}