База данных реального времени Firebase "Все или ничего" транзакции - PullRequest
0 голосов
/ 21 мая 2018

Есть ли способ манипулирования API транзакций в RTDB для «пакетной» записи? (В настоящее время мы не можем перейти на Firestore)
Наша проблема заключается в следующем:
При написании новой «Задания»объект на сервере мы выполняем три последовательных записи:

  1. Запись ключа местоположения с использованием GeoFire API
  2. Запись задания
  3. Подключениеидентификатор задания для пользователя, который его создал

К сожалению, если одна из записей завершается неудачно, но предыдущая была успешной, это вызывает серьезные ошибки в системе.
Мы ищем способы обеспечитьзавершенность или возврат операции в случае сбоя одной из записей.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Вот фрагмент из моего кода только для будущих ссылок.(Использовал ответ Рено)

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();
            }
        });
    }
0 голосов
/ 21 мая 2018

Если это просто вопрос записи и «обеспечения полноты или возврата операции в случае сбоя одной из записей», вы можете использовать одновременное обновление с помощьюupdate() method.

Как подробно описано в документации, «одновременные обновления ... являются атомарными: либо все обновления выполнены успешно, либо все обновления завершены неудачей.».См. Эту часть документации: https://firebase.google.com/docs/database/web/read-and-write#update_specific_fields

Обратите внимание, что база данных реального времени также позволяет сохранять данные как транзакции, см. Пункты документации здесь и здесь .Но, вероятно, в вашем случае будет достаточно одновременных обновлений.

...